需要澄清NSAutoreleasePool
每当我们调用autorelease
方法时,其目标是去NSAutoreleasePool
。当池被耗尽时,它会将释放发送到池中的所有对象。需要澄清NSAutoreleasePool
我的问题是;
在主函数中有一个NSAutoreleasePool
。我想知道;当我们调用autorelease
方法时,它在哪里发送对象?我的意思是;它发送的对象是NSAutoreleasePool
,它在主要功能(或)某处?
在此先感谢。
实际上有一堆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"
这是我从来没有knew..thanks的信息队友! – mayuur
+1尼斯解释并提及NSAutoreleaseNoPool():-D –
更新:Mike Ash写了一篇关于如何自己实现NSAutoreleasePool的优秀文章。在我编辑的答案中看到链接。 – DarkDust