iPhone - dealloc - 发布与零

时间:2009-09-22 05:02:38

标签: iphone memory memory-management release-management dealloc

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

  [view release];

  view = nil;  

....(void)dealloc。

有什么不同,哪一个比另一个更好? 什么是最好的方式?

在进行retainCount测试时,我个人看到nil为我减少了3到0的计数,但是发布只从3减少到2。

5 个答案:

答案 0 :(得分:36)

你所看到的可能就是这些:

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

  2. nil分配给自己的属性bar,实际上会释放当前保留的属性。如果你有一个属性的自定义setter,那么这样做是为了清除不只是支持属性的实例变量。

  3. 将使用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发送邮件不会执行任何操作。