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