为什么在使用本地var而不是仅仅自动释放后不久就会调用版本

时间:2011-05-03 19:37:11

标签: objective-c release autorelease

我经常看到如下内容:

UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  [anotherButton release];

特别是使用局部var,在这种情况下使用'anotherButton'然后释放。这是否与在分配时自动释放它然后确保在方法结束之前使用它完全相同?即:

UIBarButtonItem *anotherButton = [[[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)] autorelease];          
  self.navigationItem.rightBarButtonItem = anotherButton;

我问,因为我看到它在大量时间内完成了第一种方式,但感觉不那么容易出错(对我来说)直接自动释放它。这只是个人风格的问题,还是这两种方法之间存在差异,除了在完成任务后有条不紊地释放对象,另一种注意要求它在一开始就被释放,这样就不会意外忘了,两者都有优点。

4 个答案:

答案 0 :(得分:5)

来自{em>在Tuning for Performance and Responsiveness中明智地分配内存表7-2分配内存的提示:

  

提示

     

减少使用自动释放   对象。

     

采取的行动

     

使用自动释放释放的对象   方法留在记忆中直到你   明确地消耗电流   自动释放池或直到下一个   事件循环的时间。的每当   可能,避免使用自动释放   方法,你可以改为使用   释放方法来回收内存   被对象立即占用。如果   你必须创造适度的数字   自动释放的对象,创建一个本地   自动释放池并排干它   定期收回内存   在下一个事件之前的那些对象   循环。

答案 1 :(得分:2)

当你自动发布某些东西时,你将它添加到一组将在未来某个时候发布的对象中。这意味着这些对象仍然存在。由于iOS提供的内存有限,因此建议您尽可能使用release over autorelease。你不希望程序因内存不足而崩溃,因为你有很多自动释放的对象。

答案 2 :(得分:1)

很好的问题。通过自动释放,您将延迟对象的自动释放。当你需要从一个方法中返回一些内容时,这一切都很好,花花公子和预期的行为,但是将这个对象保留在内存中的时间超过了必要的时间会对你的应用产生影响。

通过在完成后释放它,您在此时释放资源,并且内存可以在运行时由另一个对象使用。在Cocos2D中,标准做法是自动释放几乎所有东西,事情似乎工作正常,但它仍然以错误的方式让我感到困惑,我不会在一般实践中这样做。

答案 3 :(得分:1)

他们完成了同样的事情。有些人认为你应该尽可能避免使用自动释放,所以你可以选择尽快发布。昨天才讨论here

在您引用的代码中,两者之间的差异确实很小。 anotherButton即使在self.navigationItem.rightBarButtonItem被释放后也不太可能被解除分配,因为anotherButton的分配可能会导致anotherButton被保留。

尽快调用释放的最佳理由,IMO和在这种情况下,通过发布anotherButton,您明确记录了您已经完成使用它的事实。此外,如果您在发布后使​​用{{1}},静态分析器将会发送给您。这两个事实可以帮助您避免错误,只是让您的代码更容易理解。

在这种情况下赞成自动释放的论点是它可能稍微容易阅读。我认为有一个原因是Apple为我们提供了所有这些方便的方法,比如+ stringWithFormat: - 它们让你用一种方法而不是三种方法创建和使用你想要的字符串。