使用 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】:你需要先检查anError
是nil
还是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 - 泄漏的主要内容,如果未能解决你的问题,请参考以下文章