【问题标题】:Why __bridge isn’t needed for constants from frameworks?为什么框架中的常量不需要 __bridge?
【发布时间】:2015-10-04 11:37:22
【问题描述】:

今天我发现框架中的常量不需要在 cast 语句中包含 __bridge。喜欢:

NSString *cast = (NSString *) kUTTypeMovie;

在哪里

extern const CFStringRef kUTTypeMovie __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);

我研究了这个想法,认为const 可能会影响它并且运气不好。这两个需要__bridge演员:

const CFStringRef cf_const;
NSString *ns_const = (NSString *) cf_const; // ARC bridge cast is required

CFStringRef cf_nonconst;
NSString *ns_nonconst = (NSString *) cf_nonconst;  // ARC bridge cast is required

那么有人可以解释一下吗?

【问题讨论】:

    标签: objective-c core-foundation foundation


    【解决方案1】:

    当您看到 const CFStringRef 时,它是对字符串的常量引用,这意味着您在某处有一个包含该引用的变量,并且您不能分配给该变量。它对 CFStringRef 本身没有任何意义。

    【讨论】:

    • 如果我自己写const CFStringRef,我必须写__bridge。如果它是在框架头文件中定义的,我不是。这是我的问题:为什么在某些情况下我不需要写__bridge。我知道它适用于所有免费类型,而不仅仅是CFStringRef
    【解决方案2】:

    有趣的观察。

    您发现的情况由编译器专门处理。详细信息可以在 Clang 文档的 Conversion to retainable object pointer type of expressions with known semantics 部分找到。那里说:

    桥接演员很烦人。然而,由于缺乏完全自动化 CF 对象管理的能力,我们在减少对大量显式桥接的需求方面的尝试相对较差。因此有这些规则。

    [...] 对于来自 C 可保留指针类型的 const 全局变量的加载,可以合理地假设全局系统常量是用真正的常量(例如字符串文字)初始化的,但用户常量可能已经用一些动态的东西初始化分配,使用全局初始化器。

    上述假设依赖于系统(框架)使用的编码实践,但不能假设用户定义的全局变量遵循相同的实践,因此需要显式的桥接。

    HTH

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2012-10-05
      • 2014-02-17
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多