2011-07-21 38 views
1

我有一個屬性在我的頭文件作爲的NSMutableDictionary - 「一個對象的引用計數錯誤減量......」

@property (nonatomic,retain) NSMutableDictionary* e;

,並在我的viewDidLoad:方法分配它像

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL];

XCode靜態分析器被觸發,顯然是'Potential leak of an object...'。但是當我釋放對象時([self.e release]在dealloc中),錯誤仍然存​​在,但現在它也說有一個「引用計數的不正確遞減」,並且該對象不屬於調用者(我的viewController)。

當我用[e release]替換[self.e release]時,'錯誤遞減...'錯誤消失。但前潛在泄漏的錯誤仍然存​​在。問題是什麼?

回答

2

本聲明:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL]; 

過保留的對象。 alloc-init和屬性都保留該對象。

在所有權方面,你擁有 alloc-init返回的對象,並通過在屬性訪問器中發送一個保留消息來再次聲明它的所有權,這會導致對象被過度保留。

您可以使用便捷構造,它返回一個對象喲沒有自己,讓它的屬性訪問主張所有權:

self.e = [NSMutableDictionary dictionaryWithContentsOfURL:myURL]; 

,或者使用自動釋放的:

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease]; 

或使用臨時變量:

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL]; 
self.e = tempDict; 
[tempDict release]; 
+0

另外「delleoc中的[self.e release]」是錯誤的。你應該釋放私人伊娃在dealloc。取決於你如何合成,你可以使用[e release]或[_e release]。 –

+0

當然,@傑克勞倫斯。我沒有提到這個,因爲OP寫道:「當我用'[e release]'替換'[self.e release]''時''不正確的遞減...'錯誤消失了。」所以我認爲''不正確的遞減...''錯誤被修正,只解釋了'對象的潛在泄漏...'錯誤。 – albertamg

0

的問題是:

self.e = [[NSMutableDictionary alloc] initWithContentsOfURL:myURL]; 

你的財產e有保留標誌設置。因此,在保留它之後,您將保留數增加了兩個。將它交給該屬性後,您應該釋放該對象。

self.e = [[[NSMutableDictionary alloc] initWithContentsOfURL:myURL] autorelease]; 
相關問題