【发布时间】:2011-10-25 13:36:33
【问题描述】:
使用 ARC,我无法再将 CGColorRef 转换为 id。我了解到我需要进行桥接演员表。根据clang docs:
桥接演员表是使用以下三个关键字之一注释的 C 风格演员表:
(__bridge T) op将操作数转换为目标类型T。如果T是一个可保留的对象指针类型,那么op必须有一个 不可保留的指针类型。如果T是不可保留的指针类型, 那么 op 必须有一个可保留的对象指针类型。否则演员表 格式不正确。没有所有权转移,ARC插入没有 保留操作。
(__bridge_retained T) op转换操作数,它必须有 可保留对象指针类型,指向目标类型,必须是 不可保留的指针类型。 ARC 保留价值,但须遵守 通常对局部值进行优化,接收者负责 用于平衡 +1。
(__bridge_transfer T) op转换操作数,它必须有 不可保留的指针类型,指向目标类型,它必须是 可保留对象指针类型。 ARC 会在最后释放值 封闭的完整表达式,服从通常的优化 当地价值观。需要这些转换才能将对象移入和移出 电弧控制;参见关于转换的部分的基本原理 可保留的对象指针。
使用
__bridge_retained或__bridge_transfer演员纯粹是为了说服 ARC分别发出不平衡的保留或释放很差 表格。
我会在什么样的情况下使用它们?
例如,CAGradientLayer 有一个colors 属性,它接受CGColorRefs 的数组。我的猜测是我应该在这里使用__brige,但究竟为什么我应该(或不应该)尚不清楚。
【问题讨论】:
-
你看过 WWDC 2011 session 323 了吗?这比我在这里解释的要好得多。它涵盖了从头到尾的所有细节。这是每个 Mac/iOS 开发人员必看的会议。
-
链接到 WWDC 会话,找到它并非易事:developer.apple.com/videos/play/wwdc2011/323 – 相关位在 23:15
标签: objective-c automatic-ref-counting type-conversion clang