【问题标题】:Need clarification for NSAutoreleasePool需要澄清 NSAutoreleasePool
【发布时间】:2011-11-09 08:15:01
【问题描述】:

每当我们调用autorelease 方法时,它的对象都会转到NSAutoreleasePool。当池被耗尽时,它正在向池中的所有对象发送释放。

我的问题是;
在主函数中有一个NSAutoreleasePool。我想知道;当我们调用autorelease 方法时,它会将对象发送到哪里?我是说;它正在将对象发送到 NSAutoreleasePool,它在某处的主函数 (or) 中?

提前致谢。

【问题讨论】:

    标签: iphone memory-management autorelease nsautoreleasepool


    【解决方案1】:

    实际上有一堆自动释放池。每当您执行[[NSAutoreleasePool alloc] init] 时,新创建的池会自动放在自动释放池堆栈的顶部。您可以在需要时创建自己的池。

    更准确地说:每个线程上都有一堆自动释放池。因此,每当您创建一个线程(例如使用[foo performSelectorInBackground:@selector(bar) withObject:baz])时,您需要做的第一件事就是创建一个池,否则您的对象会泄漏(这会产生臭名昭著的消息,例如 "NSAutoreleaseNoPool(): Object 0xd819d0 of class NSCFString 自动释放,没有适当的池 - 只是泄漏" 并且是 very frequently asked question here on SO)。

    当您调用autorelease 时,该对象将注册到当前线程的最顶层自动释放池(即:在该线程上最后创建的那个)。主运行循环有自己的自动释放池,在每次运行循环迭代 (AFAIK) 时都会清空。 main.m 的池用于捕获任何对象,例如,在创建运行循环自动释放池之前,Cocoa Touch 可能在内部生成这些对象。

    编辑:有关更多幕后信息,请参阅Mike Ash's "Let's Build NSAutoreleasePool"

    【讨论】:

    • +1 很好的解释和参考 NSAutoreleaseNoPool() :-D
    • 更新:Mike Ash 写了一篇关于如何自己实现 NSAutoreleasePool 的优秀文章。请参阅我编辑的答案中的链接。
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2012-06-02
    • 2017-01-18
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多