我已经阅读了一些关于autorelease做什么和常见用例的文档。我理解这是大多数人描述它的方式:“自动释放池通常在每次运行循环迭代后释放。”
运行循环的迭代到底是什么?对不起,但这个解释让我感到困惑,因为听起来很抽象......
从函数返回时是迭代吗?这是否意味着任何具有自动释放的对象都是局部变量?
答案 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处理所有内容,只需“收集”输入,刷新显示等“滴答”。