iPhone:autorelease - 什么时候发布(澄清)?

时间:2011-07-04 00:52:49

标签: iphone objective-c

我已经阅读了一些关于autorelease做什么和常见用例的文档。我理解这是大多数人描述它的方式:“自动释放池通常在每次运行循环迭代后释放。”

运行循环的迭代到底是什么?对不起,但这个解释让我感到困惑,因为听起来很抽象......

从函数返回时是迭代吗?这是否意味着任何具有自动释放的对象都是局部变量?

2 个答案:

答案 0 :(得分:5)

最简单的思考方式是:

当方法完成代码未显式调用时,运行循环结束。那是自动释放对象被释放的时候。 (这有点过于简单化了。)

如果您仔细考虑您的代码,有许多入口点您不会打电话。其中包括对用户按UIControl,UIViewController子类上的loadView或viewDidLoad,NSTimer调用的方法或使用performSelector:withObject:afterDelay:调用的内容的反应。在天空中基本上有一个大循环,它做了类似这样的事情(这里非常粗糙的伪代码):

while (YES) {
  if ([pendingDelayedSelectorCalls count] > 0) {
    [self performNextDelayedSelectorCall];  // Entry point for your code.
    [self drainAutoreleasePool];
  }
  if ([pendingTouchReactions count] > 0) {
    [self performNextTouchReaction];  // Entry point for your code.
    [self drainAutoreleasePool];
  }
  if ([pendingTimerFires count] > 0) {
    [self performNextTimerFire];  // Entry point for your code.
    [self drainAutoreleasePool];
  }
  [self collectNewPendingCallsTouchesAndTimers];
}

我确信实际的代码编写得比这更好,但是这可以让你大致了解运行循环是什么。另外,请查看this post

答案 1 :(得分:3)

请参阅:Autorelease pools in appkit applications

干净地解释AppKit(或UIKit)如何创建NSRunLoop。 runloop处理所有内容,只需“收集”输入,刷新显示等“滴答”。