NSError __autoreleasing 与 _Nullable

NSError __autoreleasing vs _Nullable

我一直都知道这种模式是管理 NSError** 参数(特别是 BOOL return 值和 NSError* __autoreleasing * 参数的方式:

-(BOOL)doSomethingWithString:(NSString*)string error:(NSError* __autoreleasing *)error {
    if(![string length]) {
        *error = [NSError blah blah];
        return NO;
    }
    return YES;
 }

要使用此方法,请遵循以下模式:

NSError* error = nil;
if([self doSomethingWithString:@"" error:&error]) {
    //great success!!
} else {
    //log error
}

现在好像把__autoreleasing换成了_Nullable?

我正在从官方 Apple 文档中查看此方法:https://developer.apple.com/reference/foundation/nsfilemanager/1415371-createdirectoryaturl?language=objc

那么,在这种情况下,我是否只需将所有 __autoreleasing 替换为 _Nullable 就可以了?如果不是,管理 NSError** 参数的新模式是什么?

不,这是两个不同的东西。

__autoreleasing为ARC指定了变量模式,这样可以正确推导出对它的读写方式

可空性指定...那么参数是否可以 nil

我认为造成混淆的原因是 Clang 自动假定 __autoreleasing 用于间接参数 (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#indirect-parameters),所以有些人只是忽略了它。如果我没记错的话,情况并非总是如此。

否则你会得到 * __autoreleasing _Nullable *。 不过说清楚也不是坏事!