开发者

Release or set to nil retained members

开发者 https://www.devze.com 2023-02-17 23:19 出处:网络
Is it better to set my retained membe开发者_如何学运维r 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 dou

Is it better to set my retained membe开发者_如何学运维r 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 nil in your -dealloc method. I personally like doing that like so:

[myVar release], myVar = nil;

If you set your instance variables to nil, you're not releasing them, and you're causing a memory leak. Setting them to nil after 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,

@property (retain) NSObject *myVar;

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, calling self.myVar = nil will 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 -init call, you would set up the aforementioned variable as such:

myVar = nil; // If you want to set it up as nil.
OR
myVar = [[NSObject alloc] init]; // Or set it up as an actual object.

Avoid self.myVar = nil and self.myVar = [[NSObject alloc] init in cases where your class is in an undeterminate state (these calls are fine in -viewDidLoad and -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).


If you're only accessing the values by way of the property accessors, simply set the property to nil and it will release.

Make sure to set all your properties to nil during dealloc as well.

0

精彩评论

暂无评论...
验证码 换一张
取 消