2010-11-05 43 views
1

嘿,我正在做一個可可觸摸靜態庫,並且我有這個問題:我應該多久使用一次NSAutoreleasePools?

我正在模擬器中使用Leaks工具運行我的項目,並且我正在爲自動釋放對象提供泄漏。

我知道一個事實,即我至少有一個NSAutoreleasePool(我的main()方法),我的問題是,我應該多長時間放置其他人(我正在爲iPhone和iPad開發,如果這很重要)

更新:我已經知道,出於某種原因,我的代碼沒有退出iOS 4上的UIApplicationMain()調用,我只是得到SIGKILL信號,而我的autorelease池沒有耗盡。我怎樣才能解決這個問題(我指的是應用程序得到一個SIGKILL

感謝

+1

我在每個選擇器中調用另一個線程。 – pt2ph8 2010-11-05 11:58:36

+0

在XCode中開發OSX應用程序時,控制檯窗口中會填充警告信息,如果有人曾經調用過導致分配的目標c函數並且沒有NSAutoreleasePool, UIKit的目標不這樣做嗎? – 2010-11-05 12:05:13

+0

哦,不,他們這樣做,但我有一個autorelease池,所以沒有在控制檯的警告,只泄漏儀器... – 2010-11-05 12:16:45

回答

1

事實上,你正在自動釋放對象本身並不能防止內存泄漏。由於在控制檯中沒有看到消息提示您的對象在池外被自動釋放,這表明問題不在於它們沒有放入池中。

您不能正確管理您的保留計數。請記住,對-alloc和-copy的所有調用必須通過調用-release或-autorelease進行平衡。也許你沒有在某個類的dealloc方法中釋放你的成員變量。首先使用儀器來查找分配/複製對象的位置,然後查看您保留的每個位置並釋放它們,以確保每個對象的保留計數均衡。

+0

我有對象保留對方,這幫助我很多,謝謝! – 2010-11-06 19:57:41

0

從WWDC視頻的標準做法認爲,有很多的變數飛來飛去緊密循環是把一個好地方。在循環之前啓動它,自動釋放循環中的所有內容都應該到達該池,然後將其排空。

2

當您運行在後臺線程的東西NSAutoreleasePool是必需的,所以如果你的函數可以在後臺運行,那麼你需要在其中創建一個自動釋放池:其中NSAutoreleasePool將

- (void) willRunInBackground{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    ... 
    [pool drain]; 
} 

第二種情況當你在一個循環中創建許多自動釋放的對象時 - 很有用,爲了避免在你周圍掛着很多自動釋放的對象,可以在循環迭代中創建和放棄自動釋放池(就像Joe提到的那樣)。

但是你的內存泄漏可能是由第一個原因引起的 - 每個線程都必須有自己的NSAutoreleasePool來處理自動釋放的對象。

+0

但奇怪的是:我只在我的應用程序中使用一個線程... – 2010-11-05 12:03:48

+1

可能是你的代碼錯了,對象沒有(自動)正確釋放?通常如果沒有nsautoreleasepool的問題,你會得到控制檯消息「自動釋放沒有到位的池 - 只是泄漏」 – Vladimir 2010-11-05 12:06:10

+0

沒有.... – 2010-11-05 12:08:00

相關問題