iOS CFObject和NSObject的相互转换(使用bridge)

        在Core Foundation框架和Foundation框架中有大量的可互换使用的数据类型。这意味着你可以使用相同的数据类型,作为Core Foundation框架方法调用或Objective-C消息的参数或接收者。这种在Core Foundation框架和Foundation框架之间交换使用数据类型的技术就叫 Toll-Free Bridging。

        由于ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge,__bridge_transfer,__bridge_retained,具体介绍和用法如下


(1)__bridge只做类型转换,但是不修改对象(内存)管理权;

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (CFURLRef)url;
        上面的这段代码在ARC环境下系统会给出错误提示和错误修正,修正后如下:
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;
系统为我们自动添加了__bridge,因为是OC创建的对象并且在转换时没有涉及对象所有权的转换,所以上面的代码不需要加CFRelease

(2)__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);
        当使用_bridge_retained标识符以后,代表OC要将对象所有权交给CF对象自己来管理,所以我们要在ref使用完成以后用CFRelease将其手动释放.

(3)__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes(
                                                                  NULL,
                                                                  (__bridge CFStringRef)text,
                                                                  NULL,
                                                                  CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
NSString *ocString = (__bridge_transfer CFStringRef)cfString;

        但并不是多有的CF对象都支持 Toll-Free Bridging!以下是支持该技术的类型表。

Core Foundation type

Foundation class

Availability

CFArrayRef

NSArray

OS X v10.0

CFAttributedStringRef

NSAttributedString

OS X v10.4

CFCalendarRef

NSCalendar

OS X v10.4

CFCharacterSetRef

NSCharacterSet

OS X v10.0

CFDataRef

NSData

OS X v10.0

CFDateRef

NSDate

OS X v10.0

CFDictionaryRef

NSDictionary

OS X v10.0

CFErrorRef

NSError

OS X v10.5

CFLocaleRef

NSLocale

OS X v10.4

CFMutableArrayRef

NSMutableArray

OS X v10.0

CFMutableAttributedStringRef

NSMutableAttributedString

OS X v10.4

CFMutableCharacterSetRef

NSMutableCharacterSet

OS X v10.0

CFMutableDataRef

NSMutableData

OS X v10.0

CFMutableDictionaryRef

NSMutableDictionary

OS X v10.0

CFMutableSetRef

NSMutableSet

OS X v10.0

CFMutableStringRef

NSMutableString

OS X v10.0

CFNumberRef

NSNumber

OS X v10.0

CFReadStreamRef

NSInputStream

OS X v10.0

CFRunLoopTimerRef

NSTimer

OS X v10.0

CFSetRef

NSSet

OS X v10.0

CFStringRef

NSString

OS X v10.0

CFTimeZoneRef

NSTimeZone

OS X v10.0

CFURLRef

NSURL

OS X v10.0

CFWriteStreamRef

NSOutputStream

OS X v10.0

参考

(1)ARC下OC对象和CF对象之间的桥接(bridge)
http://www.cnblogs.com/zzltjnh/p/3885012.html
(2)CFBridgingRetain与CFBridgingRelease的详细说明
http://blog.sina.com.cn/s/blog_7ea0400d0102v7cj.html
(3)__bridge,__bridge_retained和__bridge_transfer的意思,区别与使用
http://www.1mima.com/tag/cfbridgingrelease/
(4)苹果官方文档
https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值