2010-01-30 12 views
1

我用一個循環重複調用一個函數,並且循環在一個線程內運行。該線程有一個autorelease池。Objective-C內存管理奇怪的結果

我有一個函數內部下面的代碼:

NSXMLDocument* undoXML;
NSData* undoData = [NSData dataWithContentsOfFile:undoFilePath];
undoXML = [[NSXMLDocument alloc] initWithData:undoData options:NSXMLDocumentTidyXML error:&err];

NSData* undoData2;
undoData2 = [undoXML XMLData];

[undoData2 release];
[undoXML release];

我得到以下奇怪的結果:

  • 我的程序每次泄漏內存此功能是通過循環調用。
  • 當我下面的代碼添加到函數:

NSData* undoData3;
undoData3 = [undoXML XMLData];
[undoData3 release];

我的計劃泄漏,甚至更多的內存比以前。

我真的很困惑,我非常需要幫助弄清楚發生了什麼事情。也許我的autorelease池無法正常工作?這是爲什麼發生?

+1

奇怪的是,這是發生,因爲你釋放太多,不是太少(撤消數據2是自動釋放,所以你不應該釋放它) – cobbal 2010-01-30 04:16:40

回答

2

你確定它在泄漏嗎?還是僅僅在增長?

你的循環是什麼樣的,autorelease池是如何集成的?

autorelease池必須在循環內部,否則循環會隨着時間的推移累積大量內存。泄漏儀器不顯示泄漏表明您違反了內存管理規則或您的環路不正確。

1

嘗試在您的項目上運行儀器以檢查泄漏檢測設置。這應該確切地確定泄漏發生的位置(即使在系統庫中)。

運行 - >運行,性能工具 - >泄漏

+0

它報告沒有泄漏。 – Chetan 2010-01-30 04:25:42

+0

奇怪的問題,但你的項目啓用Objective C的垃圾收集? Mac,iPhone,iPod或iPad應用程序? – pestilence669 2010-01-30 04:30:56

+0

如果它報告沒有泄漏,你爲什麼說(在原始問題中)它正在泄漏? – gary 2010-01-30 05:26:57

-2

如果你有機會獲得NSData的類,你應該看看創建undoData3當對象被實例化的源代碼。我這樣說是因爲你創建了對象並立即銷燬它。問題一定是內存在類中被分配,但不會在析構函數中被釋放。

+0

如果NSData泄漏,所有的iPhone都會崩潰。 – pestilence669 2010-01-30 04:26:27

0

undoData應預設爲自動釋放(根據命名約定dataWithContentsOfFile:返回自動釋放對象)。但除非你有自己的自動釋放池,否則設置爲自動釋放的任何內容都將被釋放,直到活動池被耗盡(即函數返回之後的某個時間)。

您的線程可能有自己的autorelease池,但除非您在自己的函數中創建一個,否則直到函數退出後纔會釋放任何內容。

如果您想要在函數中間觸發自動釋放對象的消耗(例如每個循環一次),您需要管理自己的自動釋放池。

while(looping) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // do stuff that produces autoreleased objects 

    [pool drain]; 
} 

此外,每對您的問題cobbal的評論,它看起來像你不應該釋放undoData2(或undoData3)。基於命名約定-[NSXMLDocument XMLData]應該返回一個自動釋放對象。

+0

他會崩潰,如果他雙倍釋放,不是嗎?我仍然認爲他打開了垃圾回收。 – pestilence669 2010-01-30 22:55:55