iPhone - 的dealloc - 发行与零(iPhone - dealloc - Rele

2019-07-18 22:12发布

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

  [view release];

  view = nil;  

....的(无效)的dealloc内部。

有什么区别,是一个更好的那么其他的? 什么是最好的方法?

在做retainCount测试中,我已经亲眼见过零3落计数为0的我,但仅释放降至3〜2。

Answer 1:

你所看到的可能是这些:

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

  2. 被分配nil到属性bar上的自我,在实践中释放这种意志任何财产,目前保留。 这样做,如果你有属性的一个定制的setter,是应该清理不仅仅是实例变量后盾财产。

  3. 将覆盖指针baz参考与零的对象,但不释放对象。 其结果是一个内存泄漏。 从来没有做到这一点。



Answer 2:

如果不使用特性(其中self.property =零也将释放物体),那么你应该始终遵循由代码的释放,其设定所述参考为零,因为你所概述:

[view release]; view = nil;

原因是,它避免了他可能性的参考可以使用无效。 这是罕见的,很难有发生,但它可以发生。

这是即使在viewDidUnload更重要的是,如果你是释放IBOutlets - 这是一个更现实的方案,其中一个参考可能走坏,因为内存不足警告的卸载视图,然后在视图中一些其他的代码试图利用一个参考的前视图重新加载。

基本上,这是一个好的做法,如果你能成为一个习惯,这样做可以节省你在某个时刻崩溃。



Answer 3:

@因为你设置基准以零,你已经看到了3比0的复染计数下降bbullis22。 那么你要的“零”,这是零的retaincount。 然而,所用的是所引用的对象具有相同的保留计数 - 1(由于设定基准为nil)。 使用发布,引用仍然引用相同的对象,所以这就是为什么你看到从3在这种情况下保留计数下降到2。



Answer 4:

至于你的代码中使用,在你dealloc不需要转让的财产, releas荷兰国际集团是所有你需要做的。

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


Answer 5:

我认为同时使用是一种安全网。 只有release在地方,你可以在问题,如果你搞砸引用计数管理运行。 你会释放对象,给它的内存回系统,但指针将仍然有效。

随着nil这样保证了程序不会因为发短信崩溃nil什么也不做。



文章来源: iPhone - dealloc - Release vs. nil