内存泄漏警告我无法解决

Kie*_*ran 3 iphone cocoa memory-leaks memory-management objective-c

静态分析器在这段代码中显示泄漏(特别是与其中的副本的链接):

- (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]];
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试释放复制的对象,但我仍然收到警告.我错过了什么吗?

谢谢

ste*_*anB 5

您创建了未发布的新副本.

这将返回elements带有引用计数1的新对象,由于您刚刚创建了一个副本,因此您负责解除分配:

[elements copy];
Run Code Online (Sandbox Code Playgroud)

在此行中,您将新创建的副本添加到posts集合中.所有集合都保留新值,因此您使用引用计数1传递新副本,并且通过保留它将帖子数增加到2.

[posts addObject:[elements copy]];
Run Code Online (Sandbox Code Playgroud)

在释放时posts将发送到每个元素release,这将减少ref count为1,因此elements不会被释放,最终导致内存泄漏.

删除copy并查看是否有帮助:

[post addObject:elements];
Run Code Online (Sandbox Code Playgroud)