[英]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.