I would avoid messing with the retainCount.

Have you looked at using NSCache to retain the objects in your pool?

Other approaches that you could try:

1) Your central object pool has an array which holds a strong reference to the 
objects, and has a method (that can be called in a low-memory situation) which 
just empties the array.

2) Instead of having a central object pool, have the objects adhere to a 
protocol which takes a method to be called in low-memory situations which nils 
out things which can be reconstructed later and then calls the same method on 
objects lower in the graph.

Thanks,
Jon

> On May 17, 2015, at 5:47 PM, 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/jhull%40gbis.com
> 
> This email sent to jh...@gbis.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