需要澄清NSAutoreleasePool

时间:2011-09-02 16:45:44

标签: iphone memory-management autorelease nsautoreleasepool

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

我的问题是;
在main函数中有一个NSAutoreleasePool。我想知道;当我们调用autorelease方法时,它在哪里发送对象?我的意思是;它是将对象发送到主要功能(或)NSAutoreleasePool吗?

提前致谢。

1 个答案:

答案 0 :(得分:8)

实际上有一堆自动释放池。每当您执行[[NSAutoreleasePool alloc] init]时,新创建的池将自动置于自动释放池堆栈之上。您可以随时创建自己的池。

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

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

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