(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?
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 indealloc. So yes, in yourdeallocyou either need to sayself.loupeImage = nil;or you need to say[_loupeImage release].Original post:
If the compiler accepts the
strongkeyword, 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.