I’ve been read this thread with interest, I think you are over-complicating 
things, unless I missed something.

Look at the following pseudo code:

//  Create a New Payload Object

LTWPayloadItem*         myPayloadItem;          //An object that contains 
references to other objects
NSString*                       myItemID;                       

myItemID = @“ID-001”;
myPayloadItem = [[LTWPayloadItem alloc] initWithSomeParameters:xxxxxx];
[self.pPayloadDictionary setObject: myPayloadItem forKey: myItemID];
[myPayloadItem release];

//  At this point, myPayloadItem has a retain count of 1

So if you remove it from the dictionary (which is what you want to do under 
when under memory pressure):

[self.pPayloadDictionary removeObjectForKey: myItemID];

It will be dealloc’ed.

If another part of the application wants to access Item “ID-001”, then if they 
always access it like this:

myPayloadObject = [self.pPayloadDictionary ObjectForKey: @“ID-001"];
[myPayloadObject retain];       //Retain count of 2

Now if Item “ID-001” get removed from the dictionary, it will not be 
dealloc’ed, but it will be removed from the dictionary.

When the code has finished accessing the item “ID-001”, it executes:

[myPayloadObject release];      //Retain count of 1

Now if Item “ID-001” get removed from the dictionary, it will also be 
dealloc’ed.

Isn’t this what you want to achieve? 

Of course this would be implemented as a Global Manager Class which is called 
from other parts of the application, something like this:

-(void) addItemID:(NSString*) theID withPayloadItem:(LTWPayloadItem*) 
thePayloadItem
{
@synchronized (self.pPayloadDictionary) 
        {
        [self.pPayloadDictionary setObject: thePayloadItem forKey:theID];
        }
}

-(void) removeItemID:(NSString*) theID 
{
@synchronized (self.pPayloadDictionary) 
        {
        [self.pPayloadDictionary removeObjectForKey:theID];
        }
}

-(void) addItemID:(NSString* theID withPayloadItem:(LTWPayloadItem*) 
thePayloadItem
{
@synchronized (self.pPayloadDictionary) 
        {
        [self.pPayloadDictionary setObject: thePayloadItem forKey:theID];
        }
}

-(LTWPayloadItem*) newAccessWithID:(NSString* theID 
{
LTWPayloadItem*         myPayloadItem;

@synchronized (self.pPayloadDictionary) 
        {
        myPayloadItem = [self.pPayloadDictionary objectForKey:theID];
        }

[myPayloadItem retain];

return myPayloadItem;
}

-(void) releaseAccessWithPayload:(LTWPayloadItem*) thePayloadItem
{
[thePayloadItem release];
}

All the Best
Dave


> On 18 May 2015, at 01:47, Britt Durbrow 
> <bdurb...@rattlesnakehillsoftworks.com> wrote:
> 
> Ughh… I find myself in a bit of a quandary:
> 
> I have a pool of disk-backed (well, flash-backed on iOS) objects that have an 
> arbitrary graph structure. These are managed by a central object pool. The 
> object pool is supposed to cache these in memory (creating them is somewhat 
> non-trivial), and hold onto ones that it’s been told to even if there are no 
> other objects that currently have an active pointer to them outside of the 
> pool’s object graph (consequently, just using weak links won’t work for my 
> problem).
> 
> In order to respond to iOS memory pressure warnings, I need to have the 
> object pool de-construct and release any graph segments that are not 
> currently being used outside of the object pool. However, this needs to 
> happen only during a memory pressure event, and not otherwise.
> 
> The only thing I’ve been able to come up with so far is somehow tracking the 
> retain count state of the objects in the object pool, and when a memory 
> pressure event occurs having the object pool find all the objects that are 
> only in use in the graph and held by itself, and release them. Once all the 
> otherwise unused objects have been converted via an isa swizzle to faults 
> (and thusly no longer contain retain cycles), the faulted objects that are 
> candidates for release should have a retain count of 1… at which point I can 
> have the pool remove them from it’s main NSMutableDictionary (which will now 
> cause them to be deallocated).
> 
> This, however, is kinda ugly… and known to be prone to pitfalls... but is 
> there any better way?
> 
> Note that I don’t want to just use CoreData. Also, I did think of having the 
> objects in the graph that are supposed to be held on to be held in a strong 
> container, and the objects not currently being held on to in a weak 
> container, but that doesn’t work because then the objects in the weak 
> container will get purged when immediately, not just under a memory pressure 
> event.
> 
> 
> So what I’m looking at now is creating an intermediate base class for all of 
> these objects, that is compiled with ARC turned off, and provides access to 
> retainCount. Yes, I know that it doesn’t reflect any autoreleases that have 
> occurred on the object. This is OK as far as I know - for this specific use, 
> if something has an outstanding autorelease on an object, it’s probably OK to 
> keep it around, as long as enough of the cached objects get purged to satisfy 
> the memory pressure event. Also, this object pool is not guaranteed to be 
> thread-safe so I don’t think that the potential race conditions of 
> retain/release/autorelease/retainCount interaction will come into play.
> 
> 
> Any ideas? Comments? Rotten tomatoes? :-)
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/cocoa-dev/dave%40looktowindward.com
> 
> This email sent to d...@looktowindward.com


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to