使用 ARC 处理 NSError - 泄漏

Posted

技术标签:

【中文标题】使用 ARC 处理 NSError - 泄漏【英文标题】:handle NSError using ARC - leak 【发布时间】:2012-03-11 16:33:48 【问题描述】:
- (BOOL)parserJSONString:(NSString *)jsonString error:(NSError **)anError 
   //some data getting
   //error handle

    NSString *description = @"phone number couldn't be using";
    NSString *recoverySuggestion = @"Please provide an other phone number.";
    NSInteger errorCode = -1;
    NSArray *keys = [NSArray arrayWithObjects: NSLocalizedDescriptionKey, NSLocalizedRecoverySuggestionErrorKey, nil];
    NSArray *values = [NSArray arrayWithObjects:description, recoverySuggestion, nil];
    NSDictionary *userDict = [NSDictionary dictionaryWithObjects:values forKeys:keys];
    *anError = [[NSError alloc] initWithDomain:@"my domain" code:errorCode userInfo:userDict];
    return NO;

*anError = [[NSError alloc] initWithDomain:@"my domain" code:errorCode userInfo:userDict]; 编译器给出下一个泄漏警告 “潜在的空值取消引用。根据‘创建和返回 NSError 对象’中的编码标准,参数‘’可能为空” 如何解决这个问题?

【问题讨论】:

【参考方案1】:

你需要先检查anErrornil还是NULL

if (anError) 
    *anError = [[NSError alloc] initWithDomain:@"my domain" code:errorCode userInfo:userDict];

【讨论】:

虽然@Dirk 的答案包含有关原因的更多信息,但 DarkDust 的答案包含实际分辨率。为此 +1。【参考方案2】:

这实际上不是泄漏警告,而是可能取消引用空指针。编译器抱怨这一行

*anError = [[NSError alloc] initWithDomain:@"my domain" code:errorCode userInfo:userDict];

您分配给anError 指向的位置而不检查anError 是否实际上是空指针(“根据编码标准”是允许的,并且如果调用者不感兴趣,则可能发生详细的错误信息)。

【讨论】:

以上是关于使用 ARC 处理 NSError - 泄漏的主要内容,如果未能解决你的问题,请参考以下文章

ARC 内存泄漏

在 ARC 中使用 Blocks 和以某种方式复制的奇怪内存泄漏

返回参数对象时 ARC 的内存泄漏

对象的潜在泄漏,即使在 ARC 中?

平铺 PDF 视图正在泄漏内存(非 ARC)

为啥迁移到 ARC 后我的应用程序充满了内存泄漏?