__bridge
阅读:
iOS 学习日志(5) -----ARC中的__bridge
ARC下OC对象和CF对象之间的桥接(bridge)
由于ARC不能管理Core Foundation Object的生命周期,所以当我们在Object-C 和 Core Foundation对象之间转换(id 与 void* 之间的转换)时,我们需要使用到__bridge,__bridge_retained和__bridge_transfer三个转换关键字。
_bridge:只做类型转换,但是不修改对象(内存)所有权
_bridge_retained(CFBridgingRetain):将Objective-C的对象转换成Core Fundation的对象,同时获得对象所有权,后续使用CFRealease或其他方法释放对象。(_bridge_retained cast works as if the assigned variable has ownership of the object )
_bridge_transfer(CFBridgingRelease):当想把本来拥有对象所有权的变量,在类型转换后,让其释放原先所有权的时候(__bridge_transfer cast will release the object just after the assignment is done )
Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口
简单粗暴的理解 : 也就是说,在ARC的机制下,Core Foundation Object的生命周期生活不能自理,需要借助几个关键字来辅助.
《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》第49条有提到。 C语言级别的API称为数据结构,而没有称其为类或对象,这是因为他们与Objective-C中的类或对象并不相同。
例如,CFArray要通过CFArrayRef来引用,而只是指向struct__CFArray的指针。CFArrayGetCount这种函数则可以操作次struct,以获取数组大小。这和Objective-C中的对应物不同,在Objective-C中,可以创建NSArray对象,并在该对象上调用count方法,以获取数组大小。
下列代码演示了简单的无缝桥接:
NSArray *anNSArray = @[@1,@2,@3,@4,@5];
CFArrayRef aCFArray = (__bridge CFArrayRef)anNSArray;
NSLog(@"Size of array = %li",CFArrayGetCount(aCFArray));
转换操作中的__bridge告诉ARC,如何处理转换所涉及的Objective-C对象.
__bridge本身的意思是:ARC仍然具备这个Objective-C对象的所有权.而__bridge_retained则与之相反,意味着ARC将交出对象的所有权.若是前面那段代码改用它来实现,那么用玩数组之后就要加上CFRelease(aCFArray)以释放其内存.与之相似,反向转换可通过__bridge_transfer来实现.比方说,想把CFArrayRef转换为NSArray *,并且想令ARC获得对象所有权,那么久可以采用此种转换方式.这三种转换方式成为"桥式转换"(bridged cast)
需要理解:CF对象 和 NS对象之间的区别.
🤔: 什么情况下会考虑使用使用这种情况?
或许你会问,以纯OC来写应用的时候,为什么要用到这种功能呢?这是因为:Foundation框架中的OC类所具备的某些功能,是CoreFoundation框架中的C语言数据结构所不具备的,同理反过来想也是一样的.