2

我有一个关于自动释放的问题,现在我有以下代码:

int main(int argc, char *argv[]){
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}

文档在 @autoreleasepool{} 的末尾说,标记为 autorelease 的对象将收到一条释放消息。但是 UIApplicationMain 永远不会返回,这意味着流程永远不会到达 @autoreleasepool 的末尾,那么标记为 autorelease 的对象将永远不会被释放,直到应用程序死亡。没有自动释放的意义......

我问过有人说iOS系统会生成一些线程,(你知道,一个线程,一个runloop)。他说runloop会创建自动释放池。所以自动释放对象将在thead或runloop结束时释放. 但是大多数情况我们使用主线程。所以他说的并不能说服我。

什么是使用自动释放的合适时间。它让我很困惑。

我得到另一点,当一个运行循环结束时自动释放对象将被释放(主运行循环将在应用程序的整个生命周期中存在??)所以我不确定..

任何观点和相关文件将不胜感激!

4

1 回答 1

5

是的,从技术上讲,UIApplicationMain永远不会返回,所以它永远不会到达那个@autoreleasepool块的末尾,所以在这种情况下,如果你删除了那个@autoreleasepool块,它不会有任何区别(除了可能抱怨它们在没有自动释放池的情况下自动释放的事情)。但是,可以想象一个main函数以一种并不总是调用的方式编写UIApplicationMain(可能不是在 iOS 应用程序中,而是在一般情况下);那么它会有所作为。

@autoreleasepool始终在每个线程的入口点主体周围放置一个块是一种很好的做法,并且main是主线程的入口点。所以为了保持一致性,总是把它放在那里是有意义的。

与您交谈的人所说的是,在内部UIApplicationMain,有一个运行循环(一个处理事件的无限循环),并且在每次迭代内部都有一个自动释放池(或者可能每隔几次迭代;这是一个实现细节)。不过,这与自动释放池无关main

于 2013-03-31T04:10:45.097 回答