86.ARC下CFObject和NSObject相互转化
来源:互联网 发布:你最喜欢的首饰知乎 编辑:程序博客网 时间:2024/04/29 04:54
ARC下CFObject和NSObject相互转化
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CFObject和NSObject如何转换的?
由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之间,我们需要使用到__bridge
, __bridge_retained
和__bridge_transfer
三个转换关键字,具体介绍和用法如下.
__bridge,__bridge_retained和__bridge_transfer区别和使用
__bridge只做类型转换,但是不修改对象(内存)管理权;
__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;
__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。
__bridge
CF和OC对象转化时只涉及对象类型不涉及对象所有权的转化
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
__bridge_transfer
作用与CFBridgingRelease()相同, 常用在讲CF对象转换成OC对象时,将CF对象的所有权交给OC对象,此时ARC就能自动管理该内存
__bridge_retained
与__bridge_transfer相反, 常用在将OC对象转换成CF对象时,将OC对象的所有权交给CF对象来管理;(作用CFBridgingRetain())
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];CFURLRef ref = (__bridge_retained CFURLRef)url;CFRelease(ref);
当使用_bridge_retained标识符以后,代表OC要将对象所有权交给CF对象自己来管理,所以我们要在ref使用完成以后用CFRelease将其手动释放.
CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef)text, NULL, CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));NSString *ocString = (__bridge_transfer CFStringRef)cfString;
此时OC即获得了对象的所有权,ARC负责自动释放该对象,如果我们在结尾加上CFRelease(cfString)纯属画蛇添足,虽不会崩溃,但是控制台会打印出该对象被free了两次。
根据苹果官方的文档(https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html)
参考资料: http://www.cnblogs.com/zzltjnh/p/3885012.html
- 86.ARC下CFObject和NSObject相互转化
- NSObject和CFObject之间的转化
- iOS CFObject和NSObject的相互转换(使用bridge)
- CFObject和NSObject转换的问题
- python 下xml和dict相互转化,含attributes
- 标准c++下数字和字符串的相互转化
- UNICODE下CString 和 const char* 的相互转化
- C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
- windows 下UNICODE 多字节和utf-8相互转化
- 整型和字符串相互转化
- px 和dip 相互转化
- javabean和json相互转化
- Array和List相互转化
- 字符串和整数相互转化
- String和byte[]相互转化
- NSString和NSDate相互转化
- 对象和字典相互转化
- List和Array相互转化
- Linux 驱动面试题总结
- TabLayout2015
- 支持各种屏幕尺寸
- Python 3学习笔记1
- RPC——远程过程调用协议
- 86.ARC下CFObject和NSObject相互转化
- 【bzoj1176】[Balkan2007]Mokia
- 【XML】入门知识总结
- 【小镇的技术天梯】lanmp服务器集群搭建(5)haproxy给mysql节点负载均衡
- oracle 自定义类型 type / create type
- public,private,protected,defalut
- C#语言开发安卓App,实现滑动按钮效果的代码
- 七层网络模型(OSI)
- Eclipse快捷键总结