ios - __bridge 不需要方法参数?

标签 ios objective-c automatic-ref-counting bridge

正如我们所知,使用 ARC 我们需要一个 __bridge 来将 id 转换为 void *:

void *t = (void *)self;           // ERROR: Cast of ... requires a bridged cast
void *t = (__bridge void *)self;  // CORRECT

C 函数调用也是如此:

void f(void *t) {
  ....
}

f((void *)self);           // ERROR
f((__bridge void *)self);  // CORRECT

我认为这也适用于方法,事实上这 Beginning ARC in iOS 5 Tutorial给出以下示例,并说明需要 __bridge:

MyClass *myObject = [[MyClass alloc] init];
[UIView beginAnimations:nil context:(__bridge void *)myObject];

但是,今天我在我的一个程序的方法调用中不小心丢了一个 __bridge,代码编译和运行没有任何问题。上面示例中的 __bridge 似乎是不必要的:

[UIView beginAnimations:nil context:(void *)myObject];  // COMPILED OK

这样对吗? __bridge 在这种情况下真的没有必要吗?或者删除它会改变代码的含义?

最佳答案

这包含在 ARC docs section 3.3.3 中(强调我的):

3.3.3 Conversion from retainable object pointer type in certain contexts

[beginning Apple 4.0, LLVM 3.1]

If an expression of retainable object pointer type is explicitly cast to a C retainable pointer type, the program is ill-formed as discussed above unless the result is immediately used:

  • to initialize a parameter in an Objective-C message send where the parameter is not marked with the cf_consumed attribute, or to
  • initialize a parameter in a direct call to an audited function where the parameter is not marked with the cf_consumed attribute.

在您的代码中,myObject 是一个“可保留对象指针”。 “C 可保留指针类型”包括 void*(这是他们用作占位符的稍微草率的定义,因为 Core Foundation“对象”通常是 void*) .

因此,如果用作方法参数,ObjC 对象可以隐式转换为 void*。在那种情况下,没有额外的内存管理语义(即它等同于 __bridge 转换)。 Section 7.8警告我们 void* 将来可能不会被这样对待,但我不会担心。如果发生这种情况,添加 __bridge 将是微不足道的。

要记住的一件事是 myObject 在这里不 protected 。在动画完成之前,您需要确保以其他方式保留它,否则您可能会崩溃。

关于ios - __bridge 不需要方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21361643/

相关文章:

iOS:强制退出应用程序是否会禁用使用 NSURLSession 的后台上传?

iphone - iOS变量名和内存管理

ios5 - 如果将项目转换为自动引用计数(ARC),它是否仍然支持 iOS 3.X、4.X?

swift - SpriteKit 没有释放所有使用的内存

ios - SwiftUI - 如何停止 ScrollView 在其他 View 后面接收点击

ios - @available 对于预可用的 iOS 版本 - 缺少属性

ios - 检查服务器上的文件是否已更新

objective-c - 如何与 iWatch 应用共享类(class)?

iphone - NSManagedObject 类对象可以用作模型吗?

objective-c - Cocoa Touch NSArray 初始化无法正常工作