2011-09-02 255 views
3

每当我们调用autorelease方法时,其目标是去NSAutoreleasePool。当池被耗尽时,它会将释放发送到池中的所有对象。需要澄清NSAutoreleasePool

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

在此先感谢。

回答

8

实际上有一堆autorelease池。每当你做[[NSAutoreleasePool alloc] init]新创建的池自动放在autorelease池栈的顶部。您可以随时创建自己的游泳池。

更确切地说:每个线程上都有一堆自动释放池。所以每当你创建一个线程时(例如用[foo performSelectorInBackground:@selector(bar) withObject:baz]),你需要做的第一件事就是创建一个池或者其他对象泄漏(这会产生臭名昭着的消息,如“NSAutoreleaseNoPool():NSCFString的对象0xd819d0 autoreleased游泳池到位 - 只是漏水“,并且是very frequently asked question here on SO)。

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

编辑:欲了解更多幕后的信息,请参阅Mike Ash's "Let's Build NSAutoreleasePool"

+0

这是我从来没有knew..thanks的信息队友! – mayuur

+0

+1尼斯解释并提及NSAutoreleaseNoPool():-D –

+0

更新:Mike Ash写了一篇关于如何自己实现NSAutoreleasePool的优秀文章。在我编辑的答案中看到链接。 – DarkDust