7

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

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

4

3 回答 3

22

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

对于 iOS 处理的每个此类事件,都会在开始时创建一个的自动释放池,并在事件处理完成时将其排出。理论上,Cocoa Touch 可以创建任意数量的嵌套自动释放池,但您应该了解的主要是事件循环。

也许应用程序生命周期中的这张图会有所帮助。

UIKit 事件循环.

在伪代码中,这归结为,

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

这些是 iOS 中的事件类型

UIEventTypeTouches,
UIEventTypeMotion,
UIEventTypeRemoteControl,

因此,在处理完每个触摸、运动或远程控制事件后,池将被耗尽。

于 2011-04-23T22:01:34.443 回答
3

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

于 2011-04-23T22:07:51.180 回答
0

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

于 2011-04-23T21:24:09.407 回答