我正在尝试完成这个谜题。
__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**
(指向指针的指针),那么为什么不把 __autoreleasing
直接放在 NSError**
前面呢?
此外,可能还有其他情况需要依赖于 __autoreleasing
。