2012-06-06 48 views
2

我在我的模型中有一個簡單的方法來創建一個包含其屬性的NSDictionary對象。 不幸的是這種方法是通過「分析」看到是漏存儲器:行76(以點標記在這裏),並存儲在「DIC」分配對象的內存泄漏誤報

潛在內存泄漏。

-(NSDictionary*) getDictionary { 
    NSDictionary *dic = [[NSDictionary alloc] init]; 

    [dic setValue:(id)self.internal_code forKey:@"internal_code"]; 
    [dic setValue:(id)self.identifier forKey:@"id"]; 
    [dic setValue:(id)self.owner forKey:@"owner"]; 
    [dic setValue:(id)self.address forKey:@"address"]; 
    [dic setValue:(id)self.displayed_name forKey:@"displayed_name"]; 

    return dic; 
} 

我沒有使用ARC。 PS:對於進來的人來說,我發佈的原始代碼是正確的 - 它有一個autorelease。我在編輯它之後會重新出現內存泄漏並準確詢問原因。

+3

此代碼如何工作?您正嘗試將該值設置爲NSDictionary。你不能這樣做。 – Apurv

+0

只是一個無關的提示。你可以使你的alloc/init/autorelease只是'[NSDictionary dictionary]'。許多標準類都有這些便利的構造函數。 –

+0

你也說第76行是你的nsdictionary實例,但我認爲這是dic。它表示無論泄漏是否存儲在詞典中,而且您也沒有將詞典存儲在其中 –

回答

0

當來自不與alloccopymutableCopynew開始的方法返回的對象自動釋放,如自動釋放必須返回該對象。

從概念上講,它應該不是擁有當你返回它的代碼時。當您輸入alloccopymutableCopynew時,您將獲得所有權。當您輸入releaseautorelease時,您放棄所有權。

你可以改變你的return語句:

return [dic autorelease]; 

或者更好的是保持alloc/init/autorelease都在同一行,使代碼更易於查看和alloc和發行不能成爲意外分離,而複製和粘貼代碼:

NSDictionary *dic = [[[NSDictionary alloc] init] autorelease]; 

一個更簡單的方法是使用此便捷構造上NSDictionary

NSDictionary *dic = [NSDictionary dictionary]; 

上述內容將修復內存泄漏。然而,你也試圖改變一個不可變的類型(NSDictionary)。你應該用一個可變的字典來代替:

NSMutableDictionary *dic = [NSMutableDictionary dictionary]; 

最後,你最好應與setObject:forKey:方法設定值,雖然setValue:forKey:也會起作用。

有關內存管理的更多信息,請閱讀Advanced Memory Management Programming Guide

如果你的目標是iOS 4或更高版本,我會強烈推薦使用ARC。

+0

好吧,的確,NSDictionary並不是很聰明。對一個其他方法將使用的對象調用autorelease似乎很奇怪,但我想我應該習慣它。 感謝您的所有提示和正確的答案! – dvkch

+0

autorelease使對象保持超出方法的範圍,直到包含的自動釋放池被耗盡。通常,對於沒有創建自己的池的主線程上運行的代碼,這意味着對象將在當前runloop迭代期間保持活動狀態。 –

0

嘗試而返回DIC如下

return[dic autorelease]; 
+0

不,它不會有任何區別.. – Krishnabhadra

+0

雖然這將是錯誤的。該對象已經創建爲autoreleased。再次釋放它是不正確的。 –

+0

對不起,有一個錯誤:我沒有使用autorelease。我更正了我的問題中的代碼。 – dvkch