我已经阅读了一些关于自动发布的功能和常见用例的文档。我理解大多数人是这样描述它的:“自动释放池通常在run循环的每次迭代后释放。”
run循环的迭代究竟由什么组成?抱歉,这个解释把我搞糊涂了,因为它听起来很抽象...
当它从一个函数返回时是一个迭代吗?这是否意味着任何具有自动释放功能的对象都是局部变量?
发布于 2011-07-04 09:13:28
最简单的思考方式是这样的:
当您的代码没有显式调用的方法结束时,run循环结束。这就是释放自动释放对象的时候。(这有点过于简单了。)
如果仔细考虑代码,就会发现有许多入口点是不需要调用的。这些包括对用户在UIViewController子类上按下UIControl、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];
}我确信实际编写的代码比这更好,但这可以让您大致了解run循环是什么。另外,请查看this post。
发布于 2011-07-04 09:01:51
请参阅:Autorelease pools in appkit applications
清晰地解释了AppKit (或UIKit)如何创建NSRunLoop。runloop处理所有的事情,比如收集输入、刷新显示等等。
https://stackoverflow.com/questions/6566475
复制相似问题