iPhone – dealloc – 释放与无

想知道是否有经验的人可以解释这一点。 我见过的例子…

[view release]; view = nil; 

….(void)dealloc中。

有什么区别,是另一个更好呢? 什么是最好的方法?

在进行retainCounttesting的时候,我个人看到nil从3降到0,但是release只是从3降到2。

你看到的可能是这些:

 1) [foo release]; 2) self.bar = nil; 3) baz = nil; 
  1. 释放对象,通过实例variablesfoo访问它。 实例variables将成为一个悬挂指针。 这是dealloc中的首选方法。

  2. 将自己的属性bar分配给nil ,这将在实践中释放目前保留的任何财产。 如果你有一个属性的自定义setter,这应该清除不仅仅是支持属性的实例variables。

  3. 将用nil覆盖指向对象的指针baz ,但不会释放该对象。 结果是内存泄漏。 永远不要这样做。

如果你没有使用属性(其中self.property = nil也会释放一个对象),那么你应该总是遵循一个通过代码设置引用为nil的发布,如你所描述的:

 [view release]; view = nil; 

原因是它避免了可能会使用无效的引用。 这很less发生,但是可能发生。

这在viewDidUnload中更为重要,如果你释放IBOutlets – 这是一个更现实的场景,因为内存警告卸载视图引用可能会变坏,然后视图中的一些其他代码尝试使用引用视图重新加载。

基本上这只是一个很好的练习,如果你习惯于这样做的话,它会在一定程度上为你节省一笔费用。

@ bbullis22你已经看到从3到0的重复计数下降,因为你设置参考为零。 那么你要求零是零的零头。 但是,过去被引用的对象具有相同的保留计数 – 1(由于将引用设置为nil)。 使用版本,引用仍然引用相同的对象,所以这就是为什么你看到在这种情况下保留计数从3下降到2。

至于在代码中的使用,在你的dealloc你不需要赋值给属性,只需要发布就可以了。

 - (void)dealloc { [myProperty release]; // don't need to assign since you won't have the object soon anyway [super dealloc]; } 

我认为两者都是安全网。 只有在release ,如果您使用引用计数pipe理,则可能会遇到问题。 您将释放一个对象,将其内存返回给系统,但指针仍然有效。

nil你保证,程序不会崩溃,因为发送消息到nil什么都不做。