在下面的代码中,我想遍历一个包含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中的代码时,我得到了潜在内存泄漏的警告。对我做错了什么的想法?
答案 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]];
但是,根据您的具体需求,有几点需要注意:
您确定要复制字典吗?你可以将它添加到数组中:
[selectedCodes addObject:code];
请注意,selectedCodes
和self.codes
都包含指向同一字典的指针,因此一个副本中的更改也会反映在另一个副本中。
您可能想要创建字典的可变副本。 copy
返回一个不可变对象:
[selectedCodes addObject:[[code mutableCopy] autorelease]];