最佳答案
使用 ARC,我不能再将 CGColorRef
施放到 id
。我学到了我需要做一个桥梁石膏。根据 叮当文件:
桥式石膏是一种 C 风格的演员阵容,用以下三个关键词中的一个进行注释:
(__bridge T) op
将操作数强制转换为目标类型T
是可保留的对象指针类型,则op
必须具有 不可保留的指针类型。如果T
是不可保留的指针类型, 则 op 必须具有可保留的对象指针类型 没有所有权转移,并且 ARC 插入 no 维持运作。
(__bridge_retained T) op
强制转换操作数,操作数必须具有 可保留的对象指针类型,指向目标类型,该类型必须是 不可保留的指针类型。 ARC 保留该值,但受 通常对局部值进行优化,接收方负责 平衡那个 + 1。
(__bridge_transfer T) op
强制转换操作数,操作数必须具有 不可保留的指针类型,指向目标类型,该类型必须是 可保留的对象指针类型。 ARC 将在最后释放该值 在通常的优化条件下,对封闭的完整表达式进行优化 地方价值观。这些强制转换是为了传输进出对象 ARC 控件; 请参阅关于 可保持的对象指针。
纯粹使用
__bridge_retained
或__bridge_transfer
转换来说服 ARC 发出的不平衡保留或释放,分别是差的 表格。
在什么样的情况下,我会使用每个?
例如,CAGradientLayer
有一个 colors
属性,它接受一个 CGColorRef
数组。我的猜测是,我应该在这里使用 __brige
,但确切的原因我应该(或不应该)不清楚。