想知道是否有经验的人可能可以解释这多一点。 我见过的例子...
[view release];
view = nil;
....的(无效)的dealloc内部。
有什么区别,是一个更好的那么其他的? 什么是最好的方法?
在做retainCount测试中,我已经亲眼见过零3落计数为0的我,但仅释放降至3〜2。
想知道是否有经验的人可能可以解释这多一点。 我见过的例子...
[view release];
view = nil;
....的(无效)的dealloc内部。
有什么区别,是一个更好的那么其他的? 什么是最好的方法?
在做retainCount测试中,我已经亲眼见过零3落计数为0的我,但仅释放降至3〜2。
你所看到的可能是这些:
1) [foo release];
2) self.bar = nil;
3) baz = nil;
被释放的对象,通过实例变量访问它foo
。 实例变量将成为悬摆指针。 这是的dealloc的首选方法。
被分配nil
到属性bar
上的自我,在实践中释放这种意志任何财产,目前保留。 这样做,如果你有属性的一个定制的setter,是应该清理不仅仅是实例变量后盾财产。
将覆盖指针baz
参考与零的对象,但不释放对象。 其结果是一个内存泄漏。 从来没有做到这一点。
如果不使用特性(其中self.property =零也将释放物体),那么你应该始终遵循由代码的释放,其设定所述参考为零,因为你所概述:
[view release]; view = nil;
原因是,它避免了他可能性的参考可以使用无效。 这是罕见的,很难有发生,但它可以发生。
这是即使在viewDidUnload更重要的是,如果你是释放IBOutlets - 这是一个更现实的方案,其中一个参考可能走坏,因为内存不足警告的卸载视图,然后在视图中一些其他的代码试图利用一个参考的前视图重新加载。
基本上,这是一个好的做法,如果你能成为一个习惯,这样做可以节省你在某个时刻崩溃。
@因为你设置基准以零,你已经看到了3比0的复染计数下降bbullis22。 那么你要的“零”,这是零的retaincount。 然而,所用的是所引用的对象具有相同的保留计数 - 1(由于设定基准为nil)。 使用发布,引用仍然引用相同的对象,所以这就是为什么你看到从3在这种情况下保留计数下降到2。
至于你的代码中使用,在你dealloc
不需要转让的财产, releas
荷兰国际集团是所有你需要做的。
- (void)dealloc {
[myProperty release]; // don't need to assign since you won't have the object soon anyway
[super dealloc];
}
我认为同时使用是一种安全网。 只有release
在地方,你可以在问题,如果你搞砸引用计数管理运行。 你会释放对象,给它的内存回系统,但指针将仍然有效。
随着nil
这样保证了程序不会因为发短信崩溃nil
什么也不做。