2010-02-15 41 views
3

靜態分析器上顯示的是這個代碼塊中的泄漏(特別是在它的拷貝的鏈接):內存泄漏警告我不能解決

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"item"]) 
    { 
     [elements setObject:title forKey:@"title"]; 
     [elements setObject:date forKey:@"date"]; 
     [elements setObject:summary forKey:@"summary"]; 
     [elements setObject:link forKey:@"link"]; 

     [posts addObject:[elements copy]]; 
    } 
} 

我試圖釋放複製的對象,但我仍然得到警告。我錯過了什麼嗎?

感謝

回答

5

您創建的新副本不鬆開。

此方法返回的引用計數1,你有責任解除分配,因爲您剛纔創建的副本新elements對象:

[elements copy]; 

在此行中,添加新創建的副本,以posts它看起來像採集。 所有集合都保留新值,因此您將新副本傳遞給參考計數1,並且帖子通過保留它將參考計數增加到2。

[posts addObject:[elements copy]]; 

在發佈posts將發送給每一個元素release將遞減引用計數爲1,這樣elements沒有得到解除了分配和你結束了內存泄漏。

取出copy,看看是否有幫助:

[post addObject:elements]; 
+0

完美的謝謝。 – Kieran 2010-02-15 06:28:05

3

只是爲了一點非常清楚:

我試圖釋放複製的對象,但我仍然得到警告。

你的意思是你試過這個嗎?

[posts addObject:[elements copy]]; 
    [elements release]; 

這並不能解決問題,它可能會導致第二個問題。

你開始的問題是,你正在泄漏副本 -the對象的copy方法返回,您添加到posts的對象。這個問題仍然存在:您還沒有發佈該副本。

您添加的問題是您正在發佈的原始對象,這可能不是您想要的;我不能確定沒有看到你的其他代碼。你需要確保不要釋放elements,直到你不再需要它。

您可能想發送elements a​​消息;這將保持對象周圍,但將其清空以準備下一個元素。

在不相關的註釋中,您可能還想重命名elements以更準確地反映其字典性質並將其從XML表示中抽象出來。 「elements」聽起來像一個陣列給我。 「feedItemProperties」可能更合適。

+0

感謝您的反饋。我明白我現在做錯了什麼。謝謝。 – Kieran 2010-02-15 11:41:55