释放或设置为nil保留成员

Joe*_*oey 2 release objective-c retain

将我保留的成员变量设置为nil或者在清理时释放它们是否更好?将保留的var设置为nil似乎是一种更安全的方式来释放对象而不会冒着双重释放调用的风险.

更新:让我详细说明我指的是已设置为具有retain属性的成员变量,即:

@property (nonatomic, retain) SomeClass* mInstanceVar;
Run Code Online (Sandbox Code Playgroud)

Ita*_*ber 8

最好先释放实例变量,然后nil-dealloc方法中将它们设置为.我个人喜欢这样做:

[myVar release], myVar = nil;
Run Code Online (Sandbox Code Playgroud)

如果将实例变量设置为nil,则不会释放它们,并且会导致内存泄漏.nil在释放之后将它们设置为将确保您不会导致泄漏,并且如果由于某种原因,您稍后尝试访问这些实例变量,那么您将不会获得垃圾内存.


如果您设置了这样的实例变量,

@property (retain) NSObject *myVar;
Run Code Online (Sandbox Code Playgroud)

那么self.myVar = nil;在解除分配期间打电话不是一个好主意.如果您的对象已在您的实例变量上注册了KVO通知,则调用self.myVar = nil将发送这些通知,并且将通知其他对象,这是不好的,因为他们将期望您仍然处于有效状态 - 如果您没有你正在解除分配过程中.

即使他们没有注册KVO通知,但这样做仍然不是一个好主意,因为当状态不一致时(某些变量可能/将不存在),你永远不应该调用可能依赖于对象状态的方法,并且你应该只是自己处理这个过程.[myVar release], myVar = nil;就足够了.

如果您想了解更多信息,请阅读Dave DeLong 对此问题的回答.


对于初始化,调用属性设置器和getter也是不好的(出于与上面相同的原因).在-init通话中,您可以设置上述变量:

myVar = nil; // If you want to set it up as nil.
OR
myVar = [[NSObject alloc] init]; // Or set it up as an actual object.
Run Code Online (Sandbox Code Playgroud)

避免self.myVar = nilself.myVar = [[NSObject alloc] init在情况下,你的类是在一个undeterminate状态(这些电话都是细-viewDidLoad-awakeFromNib,但是,因为到那个时候,你的类已经完全初始化,你可以依靠的实例变量是在一个完整的状态).