我的模型中有一个简单的方法来创建一个包含其属性的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:对于进来的人来说,我发布的原始代码是正确的 - 它有一个自动释放。我之后编辑了它,因此会再次出现内存泄漏并准确询问原因。答案 0 :(得分:0)
尝试自动释放,同时返回dic,如下所示
return[dic autorelease];
答案 1 :(得分:0)
从不以alloc
,copy
,mutableCopy
或new
开头的方法返回对象时,该对象必须作为自动释放返回。
从概念上讲,当您返回时,代码不应该拥有。当您键入alloc
,copy
,mutableCopy
或new
时,您将获得对象的所有权。当您输入release
或autorelease
时,您放弃了所有权。
您可以将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。