美文网首页
__bridge,__bridge_transfer和__bri

__bridge,__bridge_transfer和__bri

作者: 13d8cd576232 | 来源:发表于2018-06-25 09:12 被阅读14次

    引言
    Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。
    Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。
    在开发iOS应用程序时我们有时会用到Core Foundation对象,下面简称CF。例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行相互转化,我们知道,ARC环境下,编译器不会自动管理CF对象的内存,我们需要手动管理。这就是说我们在创建一个CF对象以后需要我们使用CFRelease将其手动释放。

    那么CF和OC相互转化的时候该如何管理内存呢?
    我们可以通过__bridge,__bridge_transfer,__bridge_retained 来进行内存管理,其是ARC下OC对象和Core Foundation对象之间的桥梁

    1、__bridge

    CF和OC对象转化时只涉及对象类型不涉及对象所有权的转化

    //Image I/O 从 NSBundle 读取图片数据
       NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
       CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:
        [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]], NULL);
    
    OC对象转CF对象,只是转化类型,不涉及对象所有权
    

    2、__bridge_transfer

    常用在CF对象转化成OC对象时,将CF对象的所有权交给OC对象,此时ARC就能自动管理该内存,作用同CFBridgingRelease()

    //    __bridge_transfer  将CF对象的所有权(内存)交给OC对象,相当于CF对象执行了release,此时ARC就能自动管理该内存(OC对象由ARC管理内存)
        NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();
    

    3、__bridge_retained

    __bridge_retained与__bridge_transfer 相反,常用在将OC对象转化成CF对象,且OC对象的所有权也交给CF对象来管理。相当于对CF对象执行了retain操作,而OC对象本身的内存会由ARC来自动回收

    id obj = [[NSObject alloc] init];
    void *p = (__bridge_retained void *)obj;
    

    相关文章

      网友评论

          本文标题:__bridge,__bridge_transfer和__bri

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