autorelease和runloop和线程的关系?

Posted

技术标签:

【中文标题】autorelease和runloop和线程的关系?【英文标题】:the relationship of autorelease and runloop and thread? 【发布时间】:2013-03-29 06:28:34 【问题描述】:

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

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

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

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

什么是使用自动释放的正确时间。我困惑了很长时间。

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

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

【问题讨论】:

我问了同样的问题。最有可能出于语义/演示原因,什么是可接受的行为。 UIApplicationMain 的唯一出路是程序到exit(),所以无论如何任何内存都会返回给操作系统。 【参考方案1】:

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

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

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

【讨论】:

以上是关于autorelease和runloop和线程的关系?的主要内容,如果未能解决你的问题,请参考以下文章

iOS中RunLoop和线程的关系

iOS 子线程用runloop保活的一个方案

RunLoop在main线程和自己创建的线程如何启动

iOS 常见面试题--runloop

『ios』根据runloop设计保活线程

RunLoop