【问题标题】:End of run loop -- autorelease pool recovery运行循环结束——自动释放池恢复
【发布时间】:2011-08-11 15:08:07
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    也许Application Life Cycle 的这张图表会有所帮助。

    .

    在伪代码中,这归结为,

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

    这些是 iOS 中的事件类型

    UIEventTypeTouches,
    UIEventTypeMotion,
    UIEventTypeRemoteControl,
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 除非并且直到我没有为我的代码创建一个特定的 AutoRelease 池,否则在应用程序级别的堆栈中不会只有一个池吗?如果我正在创建自己的自定义自动释放池,那么这是可以理解的。 RunLoop 是否也自己创建了多个自动释放池?
        • 好吧。如果您想了解更多关于 runloops 的信息,可以在这里阅读:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 关于您的问题... 无法知道堆栈中有多少自动释放池。如果您从 runloop 而不是自定义线程执行代码,则至少有一个。当您从自定义线程执行代码时,您必须创建自己的池。
        猜你喜欢
        • 1970-01-01
        • 2010-11-12
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2013-04-16
        • 1970-01-01
        • 2013-01-18
        相关资源
        最近更新 更多