Objective c n错误**';潜在的空解引用…';

Objective c n错误**';潜在的空解引用…';,objective-c,non-nullable,Objective C,Non Nullable,举下面的例子: - (BOOL) doSomething: (NSError**) pError { *pError = [NSError ....]; } Analyzer将返回以下错误: 潜在的空解引用。根据“创建和返回N错误对象”中的编码标准,参数可能为空 建议将其更改为: - (BOOL) doSomething: (NSError**) pError { if(pError) { *pError = [NSError ....]; }

举下面的例子:

- (BOOL) doSomething: (NSError**) pError
{
    *pError = [NSError ....];
}
Analyzer将返回以下错误:

潜在的空解引用。根据“创建和返回N错误对象”中的编码标准,参数可能为空

建议将其更改为:

- (BOOL) doSomething: (NSError**) pError
{
    if(pError)
    {
        *pError = [NSError ....];
    }
}
但我更愿意向error参数添加一个nonnull属性,以阻止使用传递null。我想不出如何使参数正确。双指针是否可能具有非空属性

但我更愿意向error参数添加一个nonnull属性,以阻止使用传递null

您要查找的语法显示在各种堆栈溢出答案中,例如。例如,您可以声明:

(NSError * _Nullable * _Nonnull)
…并显示所需的警告:

然而,我建议你不要再喜欢它了。分析人员对模式的理解非常正确;你应该听听它在告诉你什么

调用通过间接寻址返回NSError的方法的标准完整模式是,例如:

NSString* path = // ... whatever;
NSStringEncoding enc = // ... whatever;
NSError* err = nil;
NSString* s =
    [NSString stringWithContentsOfFile:path encoding:enc error:&err];
if (nil == s) // oops! something went wrong...
但我绝对肯定这会奏效。那么说:

NSString* path = // ... whatever;
NSStringEncoding enc = // ... whatever;
NSString* s =
    [NSString stringWithContentsOfFile:path encoding:enc error:nil];

你不应该排除这个可能性;这是合理和正常的。

当然,这也是一个很好的答案,我想补充一点,
nil
不是
NULL
nil
始终是对(no)对象的引用,而
NSError**
并不指向(no)对象。
但是,我建议您停止使用它。
。谢谢,老实说,我需要这种想法,而你的评论正是如此。我也注意到,不要只是说你花了时间来回答潜在的问题(尽管我会遵循正确的解决方案)。