【问题标题】:How do I properly release NSMutableDictionary objects copied from one array to another?如何正确释放从一个数组复制到另一个数组的 NSMutableDictionary 对象?
【发布时间】:2011-12-19 19:39:16
【问题描述】:

在下面的代码中,我想遍历一个包含 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 中分析代码时,我收到了潜在内存泄漏的警告。关于我做错了什么有什么想法吗?

【问题讨论】:

  • 不要使用== 来比较 NSString 的。使用-isEqualToString:

标签: objective-c memory-leaks


【解决方案1】:

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

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"]

【讨论】:

  • 文字字符串不会自动释放——它们实际上是不朽的,考虑它们的最佳方式是unowned
  • @JoshCaswell 感谢您指出这一点,在 stackoverflow.com/questions/6069459/… 主题上找到了一些 SO 帖子。不知道他们只是永远活着。
  • 欢迎您!这很有趣——我认为它已经完成了,因为它们实际上是对象 (NSConstantString),而且将它们放在二进制文件的数据段中比像在堆栈上一样管理堆内存要简单得多。
【解决方案2】:

-[NSMutableArray addObject:] 保留其参数。 copy 也返回一个保留值。所以你保留了复制的字典两次

你可能想这样做:

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

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

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

    [selectedCodes addObject:code];

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2021-07-22
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多