__bridge,__bridge_transfer和__bridge_retained

引言
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;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容