ARC中__bridge, __bridge__transfer, __bridge_retaine

多数情况下,Objective-C 对象和 Core Foundation 对象之间互相转换时, 我们都应该使用__bridge。但是有时候我们确实需要给予 ARC 某个对象的所有权, 或者解除 ARC 对某个对象的所有权。这种情况下我们就需要使用另外两种 bridging casts:

  • __bridge_transfer:给予 ARC 所有权

  • __bridge_retained:解除 ARC 所有权

一旦 (__bridge_retained CFStringRef) 转换完成,ARC 就不再负责释放该 对象。如果你在这里使用 __bridge,应用就很可能会崩溃。ARC 可能在 Core Foundation 正在使用该对象时,释放掉它。

同样__bridge_retained 也有一个辅助函数:CFBridgingRetain()。从名字 就可以看出,这个函数会让 Core Foundation 执行 retain,实际如下:

现在你应该明白了,上面例子的 CFRelease()是和 CFBridgingRetain()对应 的。你应该很少需要使用__bridge_retained 或 CFBridgingRetain()。

__bridge 转换不仅仅局限于 Core Foundation 对象,某些 API 使用 void * 指针作为参数,允许你传递任何东西的引用:Objective-C 对象、Core Foundation 对象、malloc()内存缓冲区等等。void *表示这是一个指针,但实际的数据类型 可以是任何东西!

要将 Objective-C 对象和 void *互相转换,你也需要使用__bridge 转换, 如下:

 animation delegate 方法中,你再将对象强制转回来:

{

}

总结:

  • 使用 CFBridgingRelease(),从 Core Foundation 传递所有权给 Objective-C;

  • 使用 CFBridgingRetain(),从 Objective-C 传递所有权给 Core Foundation;

  • 使用__brideg,表示临时使用某种类型,不改变对象的所有权。


你可能感兴趣的:(ARC中__bridge, __bridge__transfer, __bridge_retaine)