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

Ios 这段代码的内存管理问题是什么?,ios,memory-management,coding-style,Ios,Memory Management,Coding Style,XCode分析器告诉我第4行有问题-返回[originalError copy]-但我没看到。请帮帮我好吗 - (NSError *)errorFromOriginalError:(NSError *)originalError error:(NSError *)secondError { if (secondError == nil) { return [originalError copy]; } // ... } 问题描述如下: 第203行上分配

XCode分析器告诉我第4行有问题-
返回[originalError copy]-但我没看到。请帮帮我好吗

- (NSError *)errorFromOriginalError:(NSError *)originalError error:(NSError *)secondError
{
    if (secondError == nil) {
        return [originalError copy];
    }
    // ...
}
问题描述如下:

  • 第203行上分配的对象的潜在泄漏
    • 方法返回具有+1保留计数(拥有引用)的Objective-C对象
    • 对象作为所属引用返回给调用方(单个保留计数转移给调用方)
    • 第203行上分配的对象是从名称('errorFromOriginalError:error:')不包含“copy”或以“new”或“alloc”开头的方法返回的。这违反了Cocoa(对象泄漏)的内存管理指南中给出的命名约定规则
  • 潜在的空解引用。根据“创建和返回N错误对象”中的编码标准,参数“error”可能为空
第三个问题似乎建议我应该进一步更改该方法的名称或行为。有什么建议吗?该方法源自中描述的
errorfromOriginaleror:error:
方法。其目的是将
originalError
secondError
组合在一起,以便
secondError
originalError
的子错误


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

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


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


您正在复制originalError,但函数名意味着返回的对象将自动删除。试一试

return [[originalError copy] autorelease];

您正在复制originalError,但函数名意味着返回的对象将自动删除。试一试

return [[originalError copy] autorelease];

谢谢,这确实解决了问题,除了最后一个问题(潜在的空解引用)。我怎样才能摆脱那个?我尝试添加'if(originalError==nil)return nil;'在开始的方法,但没有用。看到这个答案:谢谢。(我不知道是否不赞成在上面添加“谢谢”的评论。我认为这是礼貌的,但社区怎么想?)不知道,我自己也是新来的:-)谢谢,这确实解决了问题,除了最后一个问题(潜在的无效解引用)。我怎样才能摆脱那个?我尝试添加'if(originalError==nil)return nil;'在开始的方法,但没有用。看到这个答案:谢谢。(我不知道是否不赞成在上面加上“谢谢”的评论。我认为这是礼貌的,但社区是怎么想的?)不知道,我自己也是新来的:-)谢谢你的回答;它和jrturton的一样正确。我希望你不介意我给他打上正确的标记,因为他回答得稍微快一点;它和jrturton的一样正确。我希望你不介意我给他打上正确的标记,因为他回答得稍微快一点。