为什么框架中的常量不需要__bridge?

时间:2015-07-15 12:20:17

标签: objective-c core-foundation foundation

今天我发现在演员声明中不需要来自框架的常量__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

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:0)

当你看到const CFStringRef时,它是对字符串的常量引用,这意味着你有一个包含该引用的变量,并且不允许你赋值给变量。它对CFStringRef本身没有任何意义。

答案 1 :(得分:0)

有趣的观察。

您发现的案例由编译器专门处理。有关详细信息,请参阅Clang文档的Conversion to retainable object pointer type of expressions with known semantics部分。它说:

  

过渡演员阵容令人讨厌。然而,由于缺乏完全自动化CF对象管理的能力,我们在减少对明显桥梁供过于求的需求方面做得相对较差。因此这些规则。

     

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

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

HTH