ARC模式下OC对象和CF对象之间的桥接(Bridge)

一、概述

在IOS APP开发过程中,会使用到Core Foundation库,简称CF。如:Core Graphics,Core Text。在ARC模式下,编译器不会自动管理CF对象内存,这样,就需要我们自己管理了,当我们创建一个CF对象后,就需要使用CFRelease(CFOject)手动释放内存。如何,将OC对象和CF对象进行相互转化,要使用__bridge、__bridge_transfer、__bridge_retained。

二、使用方法

1. __bridge:在CF对象与OC对象相互转化时,此修饰只是对类型转化,不涉及对象的所有权转化。

例子:

1 NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
2 CFURLRef ref = (__bridge CFURLRef)url;

上面这段代码,创建的是一个OC对象,在OC转化为CF对象时,仅涉及到了类型转化,并未涉及对象的所有权转化,所以,内存管理依然是OC下的管理方式。

2. __bridger_transfer:将一个CF对象转化为一个OC对象时,将CF对象的所有权交给OC对象,此时ARC就能自动管理该内存;(作用同CFBridgingRelease())。

3. __bridger_retained:(与__bridge_transfer相反)将一个OC对象转化为一个CF对象时,将OC对象的所有权交给CF对象管理;(作用等同于CFBridgingRetain())。

例子:

1 NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
2 CFURLRef ref = (__bridge_retained CFURLRef)url;
3 CFRelease(ref);

PS:查阅资料:http://www.cnblogs.com/zzltjnh/p/3885012.html

原文地址:https://www.cnblogs.com/naray/p/4871493.html