Objective-C设置nil和释放之间的区别

mk1*_*k12 28 null cocoa-touch release properties objective-c

我已经知道dealloc你在做([object release];但在viewDidUnloadUIViewController子类中)你做了self.object = nil.真正的区别是因为self.object = nil(我们假设对象是(nonatomic, retain)属性)保留nil(什么也不做)然后释放旧值然后引用计数为0对吗?

smo*_*gan 54

self.object = nil调用你的setter,它将释放旧值,设置成员nil,并可能做其他事情(这是一个方法,所以它可以做任何事情)."任何"的一部分是有潜在危险的; 例如,看到这个问题.

[object release]释放旧值,但将成员留作现在悬挂的指针,这是一个很好的错误配方.在dealloc这并不重要,因为指针本身即将消失过,但在任何其他情况下,这是一个非常糟糕的主意,释放一员,而不将其设置为nil.

(作为旁注,你永远不应该假设释放一个对象给它一个引用计数为0.它会释放你的引用,但是其他对象可能仍然引用它.)

  • 另请注意,Apple特别建议不要在init和dealloc中使用setter/getter(出于好的理由),因此在dealloc中使用[object release] - 它不仅仅是"在dealloc中它并不重要",在dealloc中它是推荐的方式. (4认同)
  • @ustun注意`[myivar release]`实际上_not_使用setter.它使用支持`self.myivar`的实例变量.所以`[myivar release]`和`myivar = nil`在dealloc中完全没问题.然而`self.myivar = nil`不是. (3认同)

jac*_*ack 5

如果object = nil没有[object release],可能会导致内存泄漏.如果你[object release]没有object = nil事后没有,对象变成了@Jim建议的悬空指针.self.object = nil是一个用于setter函数调用的糖.