运行结束循环 - 自动释放池恢复

时间:2011-04-23 20:47:10

标签: iphone objective-c cocoa-touch ios nsautoreleasepool

据我所知,一旦释放自动释放的池,就会清理自动释放的对象。现在,自动释放池将在运行循环结束时释放。

我的问题是,如果在我的课程中,我没有创建自定义自动释放池并在该类中的某些对象上调用autorelease方法,那么这些对象将在何时被恢复? “运行循环结束”是否意味着“应用程序结束”?

3 个答案:

答案 0 :(得分:21)

您必须了解运行循环的概念。 iOS中的运行循环等待某些事件发生,然后它就会对其起作用。该事件可能是用户触摸屏幕,接听电话等等。

对于iOS处理的每个此类事件,都会在开头创建 new 自动释放池,并在事件处理完成时将其耗尽。从理论上讲,Cocoa Touch可以创建任意数量的嵌套自动释放池,但您应该知道的主要是事件循环。

也许来自Application Life Cycle的图表会有所帮助。

UIKit event loop

在伪代码中,归结为

int UIApplicationMain(...) {
    while (!shouldQuitApplication) {
        Event *someEvent = // wait for next event;
        NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
        // handle event
        [myPool release];
    }
}

这些是iOS中的事件类型

UIEventTypeTouches,
UIEventTypeMotion,
UIEventTypeRemoteControl,

因此,在处理完所有触摸,动作或远程控制事件后,池将被耗尽。

答案 1 :(得分:3)

运行循环的“结束”表示运行循环的每次迭代结束,而不是应用程序的结束。

答案 2 :(得分:0)

不是真的。想象一下RunLoop有“圈子”:)在每个“圈子”的开头,RunLoop创建自动释放池并在退出“圈子”之前将其排出。