The rules for memory management in Core Foundation are similar to those in Cocoa: if the method that returns a reference contains the words "create" or "copy", you own the reference and must call CFRelease()
on that reference to relinquish ownership. Otherwise, you do not own the reference and must call CFRetain
to take ownership (necessarily requiring a subsequent CFRelease
to relinquish that new ownership). These rules, as taken from the Memory Management Programming Guide for Core Foundation are:
- If you create an object (either
directly or by making a copy of
another object—see “The Create
Rule”), you own it.
- If you get an
object from somewhere else, you do
not own it. If you want to prevent it
being disposed of, you must add
yourself as an owner (using
CFRetain).
- If you are an owner of an
object, you must relinquish ownership
when you have finished using it
(using CFRelease).
In your example, both the addressBook
and the peopleArray
must be released. Since there is no autorelease
equivalent in Core Foundation, if you are returning the a reference from a method, return the array without releasing it. You should (unless you're being evil) then include "create" in the method name to indicate to the caller that they now own a reference to the returned object. In this case, CFArray is toll-free bridged to NSCFArray
, an Objective-C object that inherits from NSObject
. You can thus cast peopleArray
to an NSArray*
and autorelease
that, if you need to return it from a function/method:
return [(NSArray*)peopleArray autorelease];
Note that this only works for toll-free bridged classes. My understanding is that it's rather difficult to make your own toll-free bridged classes and only the primitive (string, array, etc.) CF classes are toll-free bridged, so this approach won't work always. Finally, if you can avoid using autorelease
(i.e. you can make your memory management more explicit), that's probably always a good thing.