最好先释放实例变量,然后在 -dealloc 方法中将它们设置为 nil。我个人喜欢这样做:
[myVar release], myVar = nil;
如果您将实例变量设置为nil,则不会释放它们,并且会导致内存泄漏。在发布后将它们设置为nil 将确保您不会导致泄漏,并且如果由于某种原因您稍后尝试访问这些实例变量,您将不会获得垃圾内存。
如果你有这样设置的实例变量,
@property (retain) NSObject *myVar;
那么在释放期间调用self.myVar = nil; 不是一个好主意。如果您的实例变量上有已注册 KVO 通知的对象,则调用 self.myVar = nil 将发送这些通知,而其他对象将收到通知,这很糟糕,因为它们会期望您仍处于有效状态 - 您如果您处于释放过程中,则不会。
即使它们没有注册 KVO 通知,这样做仍然不是一个好主意,因为当对象的状态不一致时,您永远不应该调用可能依赖于对象状态的方法(某些变量可能/将不存在) ,你应该自己处理这个过程。 [myVar release], myVar = nil; 就足够了。
如果您想了解更多信息,请阅读 Dave DeLong 对this 问题的回答。
对于初始化,调用属性 setter 和 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.
避免 self.myVar = nil 和 self.myVar = [[NSObject alloc] init 在您的类处于不确定状态的情况下(这些调用在 -viewDidLoad 和 -awakeFromNib 中很好,因为到那时,您的类已经完全初始化,并且您可以依赖实例变量处于完整状态)。