【问题标题】:release array created from parameter从参数创建的释放数组
【发布时间】:2010-05-28 15:32:44
【问题描述】:

如何释放从参数创建的数组?

我有类似的功能

-(NSMutableArray*)composePhrase:(NSString*) phraseLiteral{
   ...
   NSArray* wordLiterals=[phraseLiteral componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"[]"]];
   ...
   [wordLiterals release];
}

我总是对这个版本有问题。谁能告诉我如何使它正确?

【问题讨论】:

    标签: objective-c arrays release


    【解决方案1】:

    你需要了解Object Ownership Policy

    只有当方法名称包含allocnewcopy 时,您才会自动获得所有权。在这里,componentsSperatedByCharactersInSet: 没有。因此,返回的wordLiterals 不属于您。它是自动发布的。你不应该release它。当前事件循环完成后,当自动释放池耗尽时,它会自动释放。

    如果你想保留这个对象,你retain它。然后你拥有它。当你不再需要它时,你release它。

    【讨论】:

    • 谢谢你的回复,我还以为是自动发布的。但是当我使用“泄漏”仪器运行代码时,它表明该数组存在泄漏。可能是什么问题?
    • 这取决于您在上面的“...”中写的内容。发布更多代码。或者,运行静态分析器。查找菜单“构建和分析”。这应该在使用泄漏仪器之前进行。
    • 我对 Objective-C 还是很陌生,其中的一部分……不是我写的。所以有一个使用 for(NSString* strPh in wordLiterals) 的循环,并且在循环内 strPh 有时会再次使用 [strPh initWithString: [[resultMap objectAtIndex:0] objectForKey:@"mapping"]];其中 resultMap 是 sqlite 查询的结果。这个 strPh 也被设置为具有 [pf setEntry:strPh] 的另一个实例的属性;我希望这足以让您指出我的错误。
    • 在 Objective-C 中通过initWithString 重新初始化NSString 是一个非常糟糕的主意。不。始终使用[[NSString alloc] init...]。然后,您需要根据所有权政策的规定,用release 来平衡它。你是如何定义房产的?您是否将其设为(nonatomic, retain) 属性?涉及的点很多。
    • 感谢您指出这一点。现在我已经发布了所有的 allocs,它工作正常。
    【解决方案2】:

    componentsSeparatedByCharactersInSet:... 返回的数组是自动释放的。几乎所有像这样创建的对象都是如此——即,不是通过alloccopy

    如果你想保留它,你应该自己retain它。否则,它会在未来某个未指定的时间蒸发(或者如果没有,这不是你的责任)。

    就您不拥有的东西致电release 将不可避免地导致悲伤,所以不要这样做。在这种情况下,由于您似乎只在同一范围内使用它,您可以让它自己处理。

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多