2

我的模型中有一个简单的方法来创建一个包含其属性的 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:对于进来的人来说,我发布的原始代码是正确的——它有一个自动发布。之后我对其进行了编辑,因此内存泄漏会再次出现并准确询问原因。

4

2 回答 2

0

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

return[dic autorelease];
于 2012-06-06T11:50:16.027 回答
0

alloc从不以、或开头的方法返回对象时copy,该对象必须以自动释放的形式返回。mutableCopynew

从概念上讲,当您返回它时,它不应该您的代码所有。当您键入 、 或 时,您获得了alloc对象的copy所有权。当您键入或时,您放弃所有权。mutableCopynewreleaseautorelease

您可以将您的退货声明更改为:

return [dic autorelease];

或者更好的做法是将alloc//全部放在一行,这样代码更易于查看,并且在复制和粘贴代码时不会意外分离分配和释放:initautorelease

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。

于 2012-06-06T11:58:56.053 回答