想知道有经验的人是否可以解释这一点。我见过......的例子。
[view release];
view = nil;
....(void)dealloc。
有什么不同,哪一个比另一个更好? 什么是最好的方式?
在进行retainCount测试时,我个人看到nil为我减少了3到0的计数,但是发布只从3减少到2。
答案 0 :(得分:36)
你所看到的可能就是这些:
1) [foo release];
2) self.bar = nil;
3) baz = nil;
释放对象,通过实例变量foo
访问它。实例变量将成为悬空指针。这是dealloc中的首选方法。
将nil
分配给自己的属性bar
,实际上会释放当前保留的属性。如果你有一个属性的自定义setter,那么这样做是为了清除不只是支持属性的实例变量。
将使用nil覆盖引用该对象的指针baz
,但不会释放该对象。结果是内存泄漏。永远不要这样做。
答案 1 :(得分:8)
如果你没有使用属性(其中self.property = nil也将释放一个对象),那么你应该总是遵循一个将引用设置为nil的代码,正如你所概述的那样:
[view release]; view = nil;
原因是它避免了可能使用无效的引用的可能性。这很难发生,但可能会发生。
这在viewDidUnload中更为重要,如果你正在释放IBOutlets - 这是一个更现实的场景,其中一个引用可能因为内存警告卸载一个视图而变坏,然后视图中的一些其他代码试图利用一个重新加载视图之前的引用。
基本上这只是一种很好的做法,如果你习惯这样做,它会在某些时候挽救你。
答案 2 :(得分:2)
@ bbullis22你已经看到restain计数从3下降到0,因为你将引用设置为nil。然后你要求零的'nil'的零售额。但是,以前引用的对象具有相同的保留计数-1(由于将引用设置为nil)。 使用release,引用仍引用相同的对象,这就是为什么在这种情况下你看到保留计数从3下降到2的原因。
答案 3 :(得分:1)
就代码中的使用情况而言,在dealloc
中,您不需要分配属性,releas
就是您需要做的。
- (void)dealloc {
[myProperty release]; // don't need to assign since you won't have the object soon anyway
[super dealloc];
}
答案 4 :(得分:0)
我认为使用两者都是一种安全网。如果您使用引用计数管理,只有release
就可以运行。您将释放一个对象,将其内存返回给系统,但指针仍然有效。
使用nil
,您可以确保程序不会崩溃,因为向nil
发送邮件不会执行任何操作。