Objective-C 和 Core Foundation 对象相互转换的内存管理总结
本文转载至 http://blog.csdn.net/allison162004/article/details/38756649
OS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString 和 CFStringRef 来说,直接转换豪无压力:
- CFStringRef aCFString = (CFStringRef)aNSString;
- NSString *aNSString = (NSString *)aCFString;
针对内存管理问题,ARC 可以帮忙管理 Objective-C 对象, 但是不支持 Core Foundation 对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象。 本文重点总结一下类型转换后的内存管理。
一、非ARC的内存管理
倘若不使用ARC,手动管理内存,思路比较清晰,使用完,release转换后的对象即可。
- //NSString 转 CFStringRef
- CFStringRef aCFString = (CFStringRef) [[NSString alloc] initWithFormat:@"%@", string];
- //...
- CFRelease(aCFString);
- //CFStringRef 转 NSString
- CFStringRef aCFString = CFStringCreateWithCString(kCFAllocatorDefault,
- bytes,
- NSUTF8StringEncoding);
- NSString *aNSString = (NSString *)aCFString;
- //...
- [aNSString release];
二、ARC下的内存管理
- __bridge (不改变对象所有权)
__bridge_retained 或者 CFBridgingRetain() (解除 ARC 所有权)
__bridge_transfer 或者 CFBridgingRelease() (
给予 ARC 所有权)
1. __bridge_retained 或者 CFBridgingRetain()
- - (void)viewDidLoad {
- [super viewDidLoad];
- NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
- CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
- (void)aCFString;
- //正确的做法应该执行CFRelease
- //CFRelease(aCFString);
- }

- CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
- CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString);
2. __bridge_transfer 或者 CFBridgingRelease()
- - (void)viewDidLoad {
- [super viewDidLoad];
- NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
- CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
- aNSString = (__bridge_transfer NSString *)aCFString;
- }
CFBridgingRelease() 是__bridge_transfer的宏方法,下面两行代码等价:
- aNSString = (__bridge_transfer NSString *)aCFString;
- aNSString = (NSString *)CFBridgingRelease(aCFString);
3. __bridge
- - (void)viewDidLoad {
- [super viewDidLoad];
- NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
- CFStringRef aCFString = (__bridge CFStringRef)aNSString;
- (void)aCFString;
- }
从CF转OC,需要开发者手动释放,不归ARC管:
- - (void)viewDidLoad {
- [super viewDidLoad];
- CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
- NSString *aNSString = (__bridge NSString *)aCFString;
- (void)aNSString;
- CFRelease(aCFString);
Objective-C 和 Core Foundation 对象相互转换的内存管理总结的更多相关文章
- Objective-C:Objective-C 和 Core Foundation 对象相互转换的内存管理
Objective-C 和 Core Foundation 对象相互转换的内存管理 iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString ...
- Objective-C 和 Core Foundation 对象相互转换
iOS同意Objective-C 和 Core Foundation 对象之间能够轻松的转换: CFStringRef aCFString = (CFStringRef)aNSString; NSSt ...
- IOS开发之—— Core Foundation对象与OC对象相对转换的问题
对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...
- Objective-C对象与Core Foundation对象
Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并引用计数的对象.与Objective-C对象差别非常少.不管哪种框架生成的对象,一旦生成,便可在两 ...
- .net core中的高效动态内存管理方案
.net core在新增的System.Buffers中引入了一大堆高效内存管理的类,如span和memory.内存池.本文今天这里介绍一个高效动态内存访问方案. ReadOnlySequenceSe ...
- OC对象与Core Foundation对象的转换
OC对象使用了ARC,自己主动释放内存,可是CF中的对象没有ARC,必需要手动进行引用计数和内存释放. 两者对象之间的互相转换有三种形式: 1.__bridge: 直接转换,部改变对象的持有状况: i ...
- Core Foundation框架
转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...
- Foundation与Core Foundation内存管理基本原则简述
内存管理是一个十分重要的事情,稍有不慎就会发生内存泄漏或者是野指针的错误.内存泄漏一般表示没有任何指针指向的内存区域,由于这块内存在对象图中无法查找到,所以有可能永远都无法回收,如果内存泄漏的空间比较 ...
- Core Foundation 框架
Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...
随机推荐
- python3.6使用pickle序列化class
from library.connecter.database.mongo import Op_Mongo a = pickle.dumps(Op_Mongo) #序列化 b = pickle.loa ...
- appium window64安装教程
查看虫师的博客 地址http://www.cnblogs.com/fnng/p/4540731.html 共四篇
- jstl <fmt:formatDate>标签
<fmt:formatDate>标记用于在各种不同的方式来格式化日期 属性: <fmt:formatDate>标签具有以下属性: 属性 描述 必需 默认值 value 要显示的 ...
- PC-LINT
静态代码检查工具PC-Lint(一) 2006-12-07 23:50 C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应增加了代码中存在隐患的可能性.静态代码 ...
- ElasticSearch 监控单个节点详解
1.介绍 集群健康 就像是光谱的一端——对集群的所有信息进行高度概述. 而 节点统计值 API 则是在另一端.它提供一个让人眼花缭乱的统计数据的数组,包含集群的每一个节点统计值. 节点统计值 提供的统 ...
- 机器学习入门之四:机器学习的方法--SVM(支持向量机)(转载)
转自 飞鸟各投林 SVM(支持向量机) 支持向量机算法是诞生于统计学习界,同时在机器学习界大放光彩的经典算法. 支持向量机算法从某种意义上来说是逻辑回归算法的强化:通过给予逻辑回归算法更严格的优化条件 ...
- ping百度不通的解决方案
1.ping www.baidu.com unknow baidu.com 第一步,确定是否能ping通网关 第二步,确定是否能直接ping通外网 如ping 8.8.8.8 第三步,如果上面两个都 ...
- TCP/IP详解 卷一(第二十章 TCP的成块数据流)
本章将介绍TCP所使用的被称为滑动窗口协议的一种流量控制方法. 该协议允许发送方在停止并等待确认前可以连续发送多个分组,这样就可以加速数据的传输. 滑动窗口 下图用可视化的方法显示了滑动窗口协议 我们 ...
- libpointmatcher的filter
Maximum Density Filter Points are only considered for rejection if they exceed a density threshold, ...
- 两个页面相同js方法兼容
1. a.js页面 //Js获取Url参数 function request(paras) { var url = location.href; var paraString = url.substr ...