objective-c - 在什么情况下,我们需要在 ARC 下编写 __autoreleasing

我正在尝试完成这个谜题。

__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/

相关文章:

objective-c - 在 switch 语句中声明变量

ios - 如何从 NSDate 获取小时和分钟?

ios - 如何在 iOS 7 下更改 UIPickerView 中文本的颜色?

objective-c - 在objective-c中获取NSURL的一部分

ios - UIRefreshControl - 当 UITableViewController 在

ios - 如何使用 Swift 播放本地视频?

ios - 在 iOS 的 UITextView 中检测属性文本的点击

objective-c - 有没有办法抑制 Xcode 中的警告?

ios - UIButton自定义字体垂直对齐

iphone - 导航栏出现在带有新 iOS7 SDK 的 View 上