__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;

你可能感兴趣的:(__bridge,__bridge_transfer和__bridge_retained)