我了解到在dealloc
中你需要执行 [object release];
但是在viewDidUnload
(在UIViewController子类中)中你需要执行self.object = nil
。两者有何不同呢?因为self.object = nil
(假设object是(nonatomic, retain)
属性)会保留nil
(什么也不做),然后释放旧值,引用计数就变成0了,那么这到底有什么区别吗?
我了解到在dealloc
中你需要执行 [object release];
但是在viewDidUnload
(在UIViewController子类中)中你需要执行self.object = nil
。两者有何不同呢?因为self.object = nil
(假设object是(nonatomic, retain)
属性)会保留nil
(什么也不做),然后释放旧值,引用计数就变成0了,那么这到底有什么区别吗?
self.object = nil
调用了你的setter方法,该方法将释放旧值,将成员设置为 nil
,并可能执行其他操作(因为它是一个方法,所以它可以做任何事情)。其中“任何事情”的部分潜在地很危险;例如,请参见此问题。
[object release]
释放旧值,但是将成员留下作为现在悬空指针,这是引起错误的好方法。在 dealloc
中,它并不真的重要,因为指针本身也即将消失,但在任何其他情况下,释放成员而不将其设置为 nil
是一个非常糟糕的想法。
(另外,你永远不应该假设释放对象会使其引用计数为0. 它会释放你的引用,但是其他对象仍然可能持有对它的引用。)
object = nil
而没有执行 [object release]
,那可能会导致内存泄漏。如果你执行[object release]
而没有在之后执行 object = nil
,那么对象就会变成 @Jim 所建议的悬空指针。self.object = nil
是调用setter函数的简写形式。如果你只是释放一个对象,那么它将变成自由对象。
如果你试图对已释放的对象执行任何操作,那么你的应用程序就会崩溃。为了避免这种事故,最好在释放对象后将其“分配给nil”。因为我们都知道,在nil上执行的任何操作都不会被执行 :)
[myivar release]
实际上没有使用setter方法,而是使用了支持self.myivar
的实例变量。因此,在dealloc中使用[myivar release]
和myivar = nil
是完全可以的。然而,使用self.myivar = nil
就不行。 - memmons