将我保留的成员变量设置为nil或者在清理时释放它们是否更好?将保留的var设置为nil似乎是一种更安全的方式来释放对象而不会冒着双重释放调用的风险。
更新:让我详细说明我所指的成员变量已被设置为具有保留属性,即:。
@property (nonatomic, retain) SomeClass* mInstanceVar;
答案 0 :(得分:8)
最佳做法是先释放实例变量,然后在nil
方法中将其设置为-dealloc
。我个人喜欢这样做:
[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问题的回答。
对于初始化,调用属性设置器和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
中的这些调用很好,因为到那时,您的类已完全初始化,您可以依赖实例变量处于完整状态。)
答案 1 :(得分:2)
如果您只是通过属性访问者访问值,只需将属性设置为nil
即可释放。
确保在nil
期间将所有属性设置为dealloc
。