[Openmcl-devel] Allocating temporary nsstrings

Raffael Cavallaro raffaelcavallaro at mac.com
Sun Mar 13 12:02:24 PDT 2011


On Mar 13, 2011, at 10:50 AM, Paul Krueger wrote:

>  The fact that the caller is not responsible for objects returned by class constructors is not especially well-documented

Just for completeness, the whole Cocoa memory management scheme/disaster is documented here:

<http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html>

and the section on Convenience Constructors is in that article in the section "Practical Memory Management":

<http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html>


The usual shorthand rule is called the CAR rule; you only call #/release or #/autorelease on objects you "own" which is to say, only call #/release or #/autorelease on objects you get by calling one of:

1. C for #/copy
2. A for #/alloc and #/new (or any method beginning with "alloc" or "new")
3. R for #/retain

Everything else either belongs to some other object which will release it when its parent object is released (e.g., objects in an NSArray), or has already been autoreleased, for example, because it was created by a Convenience Constructor.

Finally, if you're creating a large number of temporary objects, say in a loop, or a smaller number of very large temporary objects (e.g., NSImage), to reduce maximum memory footprint you probably want to create and drain/release a new autorelease pool each time through the loop or each time you use a large temp object, rather than performing the whole loop or processing all of the large temp objects inside a single autorelease pool.


warmest regards,

Ralph







Raffael Cavallaro
raffaelcavallaro at me.com








More information about the Openmcl-devel mailing list