__bridge 桥接的使用

2,057 阅读1分钟

Core Foundation引入

有时候你可能需要用到一些Core Foundation对象(比如CFArrayRef或者CFMutableDictionaryRef),对于这些对象,编译器是不会自动管理它们的生命周期的,你需要使用CFRetainCFRelease之类的方法来管理它们的持有情况(ownership)。

如果要进行Core Foundation对象和Objective-C对象的相互转换,就可以使用Toll-Free Bridging

而由于ARC已不能直接使用retain、release等方法,那么在转换的时候就需要将CF指针的持有情况告知OC指针,同理OC指针在转换成CF指针时也要告知其持有情况。

三种转换方法

Toll-Free Bridging可以使用修饰符来进行转换

(1)__bridge

用于两个指针间的直接转换,不考虑持有情况;

(2)__bridge_retained

用于OC指针转换成CF指针,转换之后CF指针也会持有对象。即是,转换后被赋值的指针也会持有对象。 使用CFBridgingRetain函数也有等同效果;

(3)__bridge_transfer

用于CF指针(官方文档说的是“非OC指针”)转换成OC指针,转换之后CF指针不再持有对象。即是,转换后赋值指针不再持有对象。 使用CFBridgingRelease函数也有等同效果。