2011-09-02 253 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