2010-03-31 78 views
2

我這樣做:iPhone的Objective-C自動釋放泄漏

NSString *fullpath = [[NSBundle mainBundle] pathForResource:@"text_file" ofType:@"txt"]; 

爲什麼下面的消息出現在哪裏? 我的代碼是否泄漏?

2010-03-31 13:44:18.649 MJIPhone[2175:207] *** _NSAutoreleaseNoPool(): Object 0x3909ba0 of class NSPathStore2 autoreleased with no pool in place - just leaking 
Stack: (0x1656bf 0xc80d0 0xcf2ad 0xcee0e 0xd3327 0x2482 0x2426) 
2010-03-31 13:44:18.653 MJIPhone[2175:207] *** _NSAutoreleaseNoPool(): Object 0x390b0b0 of class NSPathStore2 autoreleased with no pool in place - just leaking 
Stack: (0x1656bf 0xc80d0 0xc7159 0xd0c6f 0xd3421 0x2482 0x2426) 
2010-03-31 13:44:18.672 MJIPhone[2175:207] *** _NSAutoreleaseNoPool(): Object 0x390d140 of class NSCFString autoreleased with no pool in place - just leaking 
Stack: (0x1656bf 0xc6e62 0xcec1b 0xd4386 0x24ac 0x2426) 
+1

它說你沒有一個自動釋放池運行在代碼執行的時候;在你沒有設置內存管理的線程中是否有這一行? – 2010-03-31 16:57:36

+0

我剛剛在主函數中添加了該代碼。 – okami 2010-03-31 17:14:24

回答

1

當您運行該行代碼時,當前線程上未創建NSAutoreleasePool

如果您在主線程上運行,Cocoa(和Cocoa Touch)會自動爲您提供自動釋放池。如果您計劃在單獨的線程上執行某些操作(其中還包括由performSelectorInBackground:withObject:安排的內容),那麼您需要提供自己的自動釋放池。

2

發生這種情況是因爲您正在線程中運行。用戶線程不共享主線程自動釋放池,因此您需要創建自己的。否則,像這樣的對象將永遠不會被釋放,從而泄漏。

在您的線程方法的開始,循環或任何之前,這樣做:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

之前返回,釋放它:

[pool drain]; 
+1

不應該是'[pool drain]'嗎? – 2010-03-31 17:06:42

+1

嗯,看起來他們在非GC系統上是同義詞。 – 2010-03-31 17:08:35

+0

@Frank有趣。我總是儘管'釋放'更加地道,因爲其他任何事情都意味着池中的電話會在通話結束後繼續存在。此外,'漏'讀取像一個壞的雙關語。但正如你所說,它們是同義詞,文件實際上指出:「你通常應該使用流失而不是釋放。」 – 2010-03-31 17:21:15