这段代码的内存管理问题是什么?

时间:2011-08-16 07:45:43

标签: ios memory-management coding-style

XCode分析仪告诉我第4行有一个问题 - return [originalError copy]; - 但是我没有看到它。请帮帮我?

- (NSError *)errorFromOriginalError:(NSError *)originalError error:(NSError *)secondError
{
    if (secondError == nil) {
        return [originalError copy];
    }
    // ...
}

问题描述是:

  • 在线203上分配的对象的潜在泄漏
    • Method返回具有+1保留计数(拥有引用)的Objective-C对象
    • 对象作为拥有引用返回给调用者(单个保留计数转移给调用者)
    • 第203行分配的对象是从名称('errorFromOriginalError:error:')不包含'copy'或以'new'或'alloc'开头的方法返回的。这违反了“Cocoa内存管理指南”(对象泄露)
    • 中给出的命名约定规则
  • 潜在的空取消引用。根据“创建和返回NSError对象”中的编码标准,参数“error”可能为null

第三个问题似乎表明我应该进一步更改方法的名称或行为。有什么建议吗?该方法源自Apple's Core Data Validation document中描述的errorFromOriginalError:error:方法。其目的是合并originalErrorsecondError,以便secondErrororiginalError的子错误。

我的添加尝试确保在没有实际secondError的情况下该方法仍然有效。由于如果secondError不是nil,则会创建一个新的错误对象,我想通过简单地复制错误对象在上面显示的情况下重新创建错误对象。

2 个答案:

答案 0 :(得分:2)

您正在制作originalError的副本,但您的函数名称暗示返回的对象将被自动释放。尝试

return [[originalError copy] autorelease];

答案 1 :(得分:1)

[originalError copy]创建一个保留计数设置为1的新对象。然后,调用方法负责release该对象。如果你这样做那么它不一定是个问题,但是自动发布它可能是一个更好的想法。

return [[originalError copy] autorelease];