使用 ARC,我无法再CGColorRef
转换为id
. 我了解到我需要进行桥接演员表。根据clang 文档:
桥接强制转换是使用以下三个关键字之一注释的 C 样式强制转换:
(__bridge T) op
将操作数强制转换为目标类型T
。如果T
是可保留对象指针类型,则op
必须具有不可保留指针类型。如果T
是不可保留的指针类型,则 op 必须具有可保留的对象指针类型。否则,演员阵容不正确。没有所有权转移,ARC 没有插入保留操作。
(__bridge_retained T) op
将必须具有可保留对象指针类型的操作数强制转换为目标类型,该目标类型必须是不可保留指针类型。ARC 保留该值,但需对本地值进行通常的优化,并且接收者负责平衡该 +1。
(__bridge_transfer T) op
将必须具有不可保留指针类型的操作数强制转换为目标类型,该目标类型必须是可保留对象指针类型。ARC 将在封闭的完整表达式的末尾释放该值,这取决于对局部值的通常优化。需要这些转换才能将对象移入和移出 ARC 控制;请参阅关于可保留对象指针的转换部分的基本原理。
纯粹使用
__bridge_retained
or__bridge_transfer
强制转换来说服 ARC 分别发出不平衡的保留或释放是不好的形式。
在什么样的情况下我会使用它们?
例如,CAGradientLayer
有一个colors
接受 s 数组的属性CGColorRef
。我的猜测是我应该__brige
在这里使用,但究竟为什么我应该(或不应该)尚不清楚。