__bridge

作者: li_礼光 | 来源:发表于2016-12-07 11:01 被阅读22次

    阅读:
    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语言数据结构所不具备的,同理反过来想也是一样的.

    相关文章

      网友评论

        本文标题:__bridge

        本文链接:https://www.haomeiwen.com/subject/qfedmttx.html