美文网首页
__bridge,__bridge_transfer和__bri

__bridge,__bridge_transfer和__bri

作者: guoguojianshu | 来源:发表于2021-04-15 10:43 被阅读0次

    __bridge是oc对象和CF对象之间的相互转换,但是不涉及对象所有权的转换
    __bridge_transfer是cf对象转为oc对象,将cf对象的所有权转给oc对象,此时ARC自动管理内存,作用同CFBridgingRelease()
    __bridge_retained是OC对象转为CF对象,将OC对象的所有权转给CF对象,即OC对象转化成CF对象时,涉及到对象类型和对象所有权的转化,作用同CFBridgingRetain()

    0x01 什么是对象间的桥接
    Core Foundation 是一组C语言接口,它与Foundation功能相同,只是Foundation框架提供的是Objective-C接口。

    Core Foundation中的对象也有类似引用计数的概念,其对应的接口是CFRetain/CFRelease;

    这两个框架的对象之间可以相互转换,当使用ARC时,Core Foundation中的对象不被ARC所管理

    所以Core Foundation和Foundation中的对象在相互转换的过程中会涉及到对象所有权的转换,这里便用到了bridge修饰符

    __bridge关键字修饰的类型转换只把OC对象的指针传递给CF对象,但不传递它的所有权:

    NSString *theString = @"Learn Objective-C";
    cfString = (__bridge CFStringRef)theString;
     
    // cfString gets the assignment, but ownership stays with theString.
    

    当cfString被ARC release后,theString指针仍然指向一个有效的对象。
    __bridge_retained
    将OC对象转化为CF对象时,所有权归CF对象,相当于 CFBridgingRetain():

    NSString *theString = @"Learn Objective-C";
    cfString = (__bridge_retained CFStringRef)theString
     
    //In this case, cfString string owns the pointer and its retain count is incremented.
    //You’re responsible for managing it with retain/release.
    

    使用__bridge_retained进行转换后,cfString便拥有了theString对象的所有权。

    这时如果theString被ARC release,cfString仍然有效。

    然而又因为Core Foundation中的对象也存在引用计数概念,所以需要使用CFRelease()手动对cfString进行release操作。

    __bridge_transfer
    这是与__bridge_retained相反的关键字声明。

    __bridge_transfer将CF对象转化为OC对象时,所有权归OC对象,相当于CFbridgingRelease():

    NSString *theString = @"Learn Objective-C";
    cfString = (__bridge_transfer CFStringRef)theString;
     
    //In this case, ARC owns the object and will ensure it’s released like any other ARC object.
    

    使用__bridge_transfer进行转换后,ARC会确保theString被释放的同时,cfString也被释放。

    相关文章

      网友评论

          本文标题:__bridge,__bridge_transfer和__bri

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