如何正确释放从一个数组复制到另一个数组的NSMutableDictionary对象?

时间:2011-11-01 20:20:20

标签: objective-c memory-leaks

在下面的代码中,我想遍历一个包含NSMutableDictionary对象的NSMutableArray(self.codes)。如果“selected”键的值等于“1”,那么我想复制NSMutableDictionary“code”对象并将其添加到selectedCodes数组。

1  -(NSMutableArray *)getSelecedCodes{
2  
3  NSMutableArray *selectedCodes=[[NSMutableArray alloc]init];
4  
5  for (NSMutableDictionary *code in self.codes) {
6    if([code valueForKey:@"selected"]==@"1"){
7      [selectedCodes addObject:[code copy]];
8    }
9  }
10
11 return selectedCodes;
12
13 }

当我分析XCode中的代码时,我得到了潜在内存泄漏的警告。对我做错了什么的想法?

2 个答案:

答案 0 :(得分:3)

您应该在添加时自动释放复制的对象

for (NSMutableDictionary *code in self.codes) {
    if([code valueForKey:@"selected"]==@"1"){
        [selectedCodes addObject:[[code copy] autorelease]];  
    }
}

您还应该使用字符串比较方法而不是简单的指针比较:

[code valueForKey:@"selected"]==@"1"

永远不会成真,而是使用

[[code valueForKey:@"selected"] isEqualToString:@"1"]

答案 1 :(得分:3)

-[NSMutableArray addObject:]保留其论点。 copy也会返回保留值。所以你要保留复制的字典两次

你可能想这样做:

[selectedCodes addObject:[[code copy] autorelease]];

但是,根据您的具体需求,有几点需要注意:

  1. 您确定要复制字典吗?你可以将它添加到数组中:

    [selectedCodes addObject:code];

    请注意,selectedCodesself.codes都包含指向同一字典的指针,因此一个副本中的更改也会反映在另一个副本中。

  2. 您可能想要创建字典的可变副本。 copy返回一个不可变对象:

    [selectedCodes addObject:[[code mutableCopy] autorelease]];