Search code examples
objective-ciosautomatic-ref-countingcore-foundation

Retained Core Foundation Property


(Xcode 4.2, iOS 5, ARC)

I have some properties of Core Foundation (/Graphics) objects that should take ownership of their objects. Now in these Apple docs I found this:

In OS X v10.6 and later, you can use the __attribute__ keyword to specify that a Core Foundation property should be treated like an Objective-C object for memory management: @property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;

Unfortunately I couldn't find any elaboration on this. I'm using this:

@property (nonatomic, strong) __attribute__((NSObject)) CGImageRef loupeImage;

And it seems to work the way I'd expect. It retains the object on setting the property and releases it when I set the property to nil.

Now my question is, do I still need to explicitly set those properties to nil in my dealloc?


Solution

  • Edit: My previous post was incorrect. __attribute__((NSObject)) on the property only causes it to retain/release the property when using the property accessors. It does not affect access to the ivar, and notably, it does not nil out (or release) the property in dealloc. So yes, in your dealloc you either need to say self.loupeImage = nil; or you need to say [_loupeImage release].


    Original post:

    If the compiler accepts the strong keyword, then it's going to treat it correctly, retaining and releasing as expected, and nilling out automatically in ARC. The whole idea of __attribute__((NSObject)) is it tells the compiler to treat this object exactly as if it were an obj-c object, and so that's what it does.

    So no, you shouldn't have to explicitly nil them out in dealloc. You'll get the default ARC behavior of nilling/releasing automatically.