24

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

  [view release];

  view = nil;  

....在(void)dealloc中。

有什么区别,一个比另一个更好?什么是最好的方法?

在进行 retainCount 测试时,我个人看到 nil 将计数从 3 降至 0,但 release 仅将其从 3 降至 2。

4

5 回答 5

36

你看到的大概是这些:

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

  2. 正在分配给nil自己的一个属性bar,这实际上将释放该属性当前保留的任何内容。如果您有该属性的自定义设置器,请执行此操作,该设置器应该清理的不仅仅是支持该属性的实例变量。

  3. 将用 nil 覆盖baz引用该对象的指针,但不释放该对象。结果是内存泄漏。永远不要这样做。

于 2009-09-22T05:12:38.577 回答
8

如果您不使用属性(其中 self.property = nil 也将释放一个对象),那么您应该始终遵循将引用设置为 nil 的代码的发布,如您所述:

[view release]; view = nil;

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

这在 viewDidUnload 中更为重要,如果您正在释放 IBOutlets - 这是一个更现实的场景,其中引用可能会因为内存警告卸载视图而变坏,然后视图中的一些其他代码试图在视图被重新加载。

基本上,这只是一种很好的做法,如果你养成这样做的习惯,它会在某个时候为你避免崩溃。

于 2009-09-22T16:57:02.553 回答
2

@ bbullis22,您已经看到恢复计数从 3 下降到 0,因为您将引用设置为 nil。然后你要求'nil'的retaincount为零。但是,曾经被引用的对象具有相同的保留计数 - 1(由于将引用设置为 nil)。使用 release,引用仍然引用同一个对象,这就是为什么在这种情况下您会看到保留计数从 3 下降到 2。

于 2010-03-03T12:23:08.837 回答
1

就代码中的用法而言,您dealloc不需要分配给属性,releasing 就是您需要做的一切。

- (void)dealloc {
    [myProperty release]; // don't need to assign since you won't have the object soon anyway
    [super dealloc];
}
于 2009-09-22T05:57:18.983 回答
0

我认为同时使用两者是一种安全网。如果release你搞砸了引用计数管理,你可能会遇到问题。您将释放一个对象,将其内存还给系统,但指针仍然有效。

nil您一起保证程序不会崩溃,因为发送消息nil什么都不做。

于 2009-09-22T05:12:23.227 回答