簡體   English   中英

我無法解決的內存泄漏警告

[英]Memory Leak warning I can't solve

靜態分析器在以下代碼塊(特別是其中包含副本的鏈接)中顯示泄漏:

- (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]];
    }
}

我嘗試釋放復制的對象,但仍然收到警告。 我想念什么嗎?

謝謝

您創建了不發布的新副本。

這將返回引用計數為1的新elements對象,由於您剛剛創建了副本,因此您需要對其進行分配:

[elements copy];

在這一行中,您將新創建的副本添加到看起來像集合的posts中。 所有集合都保留新值,因此您傳遞的引用數為1的新副本,發布后通過保留引用數將引用數增加為2。

[posts addObject:[elements copy]];

在發行版上, posts將發送到每個元素release ,這會將ref計數遞減為1,因此不會釋放elements ,最終導致內存泄漏。

刪除copy ,看看是否有幫助:

[post addObject:elements];

只是為了明確一點:

我嘗試釋放復制的對象,但仍然收到警告。

你的意思是你嘗試過嗎?

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

那不能解決問題,並且可能引起第二個問題。

您開始遇到的問題是泄漏了副本copy方法返回的對象,添加到posts的對象。 問題仍然存在:您尚未發布副本。

您添加的問題是您要釋放原始對象,這可能不是您想要的。 我不能肯定地說不看你的其他代碼。 您需要確保不再釋放elements直到不再需要它為止。

您可能想向elements發送removeAllObjects消息; 這樣可以保留對象,但將其清空以准備下一個元素。

無關緊要的是,您可能還想重命名elements以更准確地反映其字典性質並將其從XML表示中抽象出來。 對我來說,“ elements ”聽起來像是一個數組。 feedItemProperties ”可能更合適。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM