(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 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.