2008-10-08 77 views
25

的文檔+[NSThread detachNewThreadSelector:toTarget:withObject:]說:NSOutration中的NSAutoreleasePool main?

對於非垃圾收集應用,上述方法aSelector負責 設立一個自動釋放池爲新分離的線程和釋放 該池在退出前。

我的問題是,我需要在我的-[NSOperation main]方法的覆蓋來創建自己的NSAutoreleasePool,或者是NSAutoreleasePool創建由NSOperation處理?

回答

12

是的,你這樣做。你正在定義一個獨立的工作,NSOperationQueue將在「某些」線程上執行,因此你需要負責管理該工件中的內存。

6

你不需要在你的main中創建你自己的NSAutoreleasePool,系統爲你做。要看到這一點,使用Xcode菜單命令運行>顯示>斷點打開斷點窗口並輸入: - [NSAutoreleasePool初始化]

現在運行您的程序,你會看到一個autorelease池創建內部NSOperation 。

另請參閱Apple的示例,例如http://developer.apple.com/Cocoa/managingconcurrency.html,它們不會創建自己的自動釋放池。

+0

我認爲你必須如果他們不是主線程NSOperations,根據其他評論在這裏。 – mxcl 2011-02-10 18:50:20

0

是的,你需要。

- (void) main 
{ 
    NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init]; 
    //your code here 
    //more code 
    [thePool release]; 
} 

,如果你不創建一個自動釋放池,任何舒適類的初始化(如[的NSString stringWithFormat:]),因爲這些初始化返回自動釋放的對象會泄漏。

+0

根據Apple文檔,您不應該爲autoreleasePool調用release,您應該調用drain。 – 2012-03-13 09:19:34

14

好問題,即使是蘋果自己的文檔和示例代碼也不是很清楚。我相信我已經找到了答案,但:

由於操作是Objective-C的 對象,你應該總是在 執行你的任務代碼的早期創建 自動釋放池。 自動釋放池提供保護 ,以防止在您的任務執行期間發生泄漏的Objective-C 對象被自動釋放。雖然有 可能已經到位,泳池 執行您的自定義代碼的時間, 你永遠不應該依賴於行爲 ,應始終提供自己。

基本上,即使可能有大衛提到的游泳池,您仍然應該創建自己的游泳池。