内存泄漏误报

时间:2012-06-06 11:41:57

标签: objective-c xcode memory-leaks clang-static-analyzer

我的模型中有一个简单的方法来创建一个包含其属性的NSDictionary对象。 不幸的是,这种方法被“分析”看作是泄漏内存:

在第76行分配的对象的潜在内存泄漏(此处标有点)并存储在'dic'中。

-(NSDictionary*) getDictionary {
    NSDictionary *dic = [[NSDictionary alloc] init];

    [dic setValue:(id)self.internal_code forKey:@"internal_code"];
    [dic setValue:(id)self.identifier forKey:@"id"];
    [dic setValue:(id)self.owner forKey:@"owner"];
    [dic setValue:(id)self.address forKey:@"address"];
    [dic setValue:(id)self.displayed_name forKey:@"displayed_name"];

    return dic;
}

我没有使用ARC。

PS:对于进来的人来说,我发布的原始代码是正确的 - 它有一个自动释放。我之后编辑了它,因此会再次出现内存泄漏并准确询问原因。

2 个答案:

答案 0 :(得分:0)

尝试自动释放,同时返回dic,如下所示

return[dic autorelease];

答案 1 :(得分:0)

从不以alloccopymutableCopynew开头的方法返回对象时,该对象必须作为自动释放返回。

从概念上讲,当您返回时,代码不应该拥有。当您键入alloccopymutableCopynew时,您将获得对象的所有权。当您输入releaseautorelease时,您放弃了所有权。

您可以将return语句更改为:

return [dic autorelease];

或者更好的方法是将alloc / init / autorelease全部放在一行,以便代码更容易查看,并且在复制时,分配和释放不会被意外分开和粘贴代码:

NSDictionary *dic = [[[NSDictionary alloc] init] autorelease];

更简单的方法是在NSDictionary上使用此便利构造函数:

NSDictionary *dic = [NSDictionary dictionary];

以上几行将修复内存泄漏。但是,您也试图改变不可变类型(NSDictionary)。您应该使用可变字典:

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

最后,理想情况下,您应使用setObject:forKey:方法设置值,但setValue:forKey:也可以使用。

有关内存管理的更多信息,请阅读Advanced Memory Management Programming Guide

如果您的目标是iOS 4或更高版本,我强烈建议您使用ARC。