Is it better to set my retained member vars to nil or to release them when I am cleaning up? Setting a retained var to nil seems a safer way to release an object without risking a double release call on it.
Update: Let me elaborate that I’m referring to member vars that have been set to have the retain property i.e.:
@property (nonatomic, retain) SomeClass* mInstanceVar;
It’s best practice to release your instance variables first, and then set them to
nilin your-deallocmethod. I personally like doing that like so:If you set your instance variables to
nil, you’re not releasing them, and you’re causing a memory leak. Setting them tonilafter releasing though will ensure that you’re not causing leaks, and if, for some reason, you try to access those instance variables later, you’re not going to get garbage memory.If you have an instance variable set up as such,
then it is not a good idea to call
self.myVar = nil;during deallocation. If you have objects that have registered for KVO notifications on your instance variable, callingself.myVar = nilwill send those notifications, and other objects will be notified, which is bad because they will be expecting you to still be in a valid state—you’re not if you’re in the deallocation process.Even if they’re not registered for KVO notifications, it’s still not a good idea to do that because you should never call methods that could rely on your object’s state when its state is inconsistent (some variables might/will be nonexistent), and you should simply handle the process yourself.
[myVar release], myVar = nil;will suffice.If you want more information, read Dave DeLong’s answer to this question.
For initializing, it is also not good to call property setters and getters (for much the same reason as above). In an
-initcall, you would set up the aforementioned variable as such:Avoid
self.myVar = nilandself.myVar = [[NSObject alloc] initin cases where your class is in an undeterminate state (these calls are fine in-viewDidLoadand-awakeFromNib, though, because by that point, your class has been completely initialized, and you can rely on the instance variables to be in a complete state).