2

给出以下示例:

- (BOOL) doSomething: (NSError**) pError
{
    *pError = [NSError ....];
}

分析器将返回以下错误:

潜在的 null 取消引用。根据“创建和返回 NSError 对象”中的编码标准,该参数可能为空。

建议将其更改为:

- (BOOL) doSomething: (NSError**) pError
{
    if(pError)
    {
        *pError = [NSError ....];
    }
}

但我更愿意在错误参数中添加一个非空属性,以阻止使用传递空值。我无法弄清楚如何让这个论点正确。双指针是否有可能具有非空属性?

4

1 回答 1

4

但我更愿意在错误参数中添加一个非空属性,以阻止使用传递空值。

您正在寻找的语法显示在各种 Stack Overflow 答案中,例如Objective-C nullability for output parameters。因此,您可以声明,例如:

(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];

你不应该排除这一点;这是合理和正常的。

于 2018-02-14T20:20:08.823 回答