今天我发现在演员声明中不需要来自框架的常量__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
有人可以解释一下吗?
答案 0 :(得分:0)
当你看到const CFStringRef时,它是对字符串的常量引用,这意味着你有一个包含该引用的变量,并且不允许你赋值给变量。它对CFStringRef本身没有任何意义。
答案 1 :(得分:0)
有趣的观察。
您发现的案例由编译器专门处理。有关详细信息,请参阅Clang文档的Conversion to retainable object pointer type of expressions with known semantics部分。它说:
过渡演员阵容令人讨厌。然而,由于缺乏完全自动化CF对象管理的能力,我们在减少对明显桥梁供过于求的需求方面做得相对较差。因此这些规则。
[...]对于来自C可保持指针类型的const全局变量的加载,可以合理地假设全局系统常量用真常量初始化(例如字符串文字),但用户常量可能已经用动态初始化了使用全局初始化程序分配。
上述假设依赖于系统(框架)使用的编码实践,但不能假定用户定义的全局变量遵循相同的实践,因此需要显式桥接。
HTH