我正在尝试完成这个谜题。
__strong
是所有 Objective-C 可保留对象指针(如 NSObject、NSString 等)的默认值。它是一个强引用。 ARC 在作用域末尾用 -release
平衡它。
__unsafe_unretained
等于旧方法。用于不保留可保留对象的弱指针。
__weak
与 __unsafe_unretained
类似,只是它是一个自动归零的弱引用,这意味着一旦引用的对象被释放,指针就会被设置为 nil。这消除了悬空指针和 EXC_BAD_ACCESS 错误的危险。
但是 __autoreleasing
到底有什么用呢?我很难找到关于何时需要使用此限定符的实际示例。我相信它仅适用于需要指针指针的函数和方法,例如:
- (BOOL)save:(NSError**);
或
NSError *error = nil;
[database save:&error];
在 ARC 下必须这样声明:
- (BOOL)save:(NSError* __autoreleasing *);
但这太模糊了,我想完全理解为什么。我发现的代码片段将 __autoreleasing 放在两颗星之间,这对我来说看起来很奇怪。类型是 NSError**
(一个指向 NSError 的指针),那么为什么要把 __autoreleasing
放在星星之间而不是简单地放在 NSError**
?
另外,在其他情况下我可能必须依赖 __autoreleasing
。
最佳答案
你是对的。正如官方文档解释的那样:
__autoreleasing to denote arguments that are passed by reference (id *) and are autoreleased on return.
所有这些在 ARC transition guide 中都有很好的解释。 .
在您的 NSError 示例中,声明意味着 __strong
,隐含地:
NSError * e = nil;
将转化为:
NSError * __strong error = nil;
当您调用 save
方法时:
- ( BOOL )save: ( NSError * __autoreleasing * );
然后编译器必须创建一个临时变量,设置在 __autoreleasing
。所以:
NSError * error = nil;
[ database save: &error ];
将转化为:
NSError * __strong error = nil;
NSError * __autoreleasing tmpError = error;
[ database save: &tmpError ];
error = tmpError;
您可以通过将错误对象直接声明为 __autoreleasing
来避免这种情况。
关于objective-c - 在什么情况下,我们需要在 ARC 下编写 __autoreleasing 所有权限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862023/