【问题标题】:NSError** 'Potential null dereference.....'NSError** '潜在的空取消引用.....'
【发布时间】:2018-02-14 20:11:26
【问题描述】:

举个例子:

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

分析器将返回以下错误:

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

建议将其更改为:

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

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

【问题讨论】:

    标签: objective-c non-nullable


    【解决方案1】:

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

    您要查找的语法显示在各种 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];
    

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

    【讨论】:

    • 即使这是 - 当然 - 一个很好的答案,我想补充一点,nil 不是NULLnil 始终是对 (no) object 的引用,而 NSError** 确实 not 指向 (no) object
    • I would suggest instead, however, that you simply stop preferring that.。谢谢,老实说,我需要那种打击,而你的评论正是这样做的。我也同意这一点,而不是仅仅说您花时间回答了基本问题(尽管我会遵循​​正确的解决方案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2020-12-21
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多