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;
-
释放对象,通过实例variables
foo
访问它。 实例variables将成为一个悬挂指针。 这是dealloc中的首选方法。 -
将自己的属性
bar
分配给nil
,这将在实践中释放目前保留的任何财产。 如果你有一个属性的自定义setter,这应该清除不仅仅是支持属性的实例variables。 -
将用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
什么都不做。