Objective-C 和 Core Foundation 对象相互转换
iOS同意Objective-C 和 Core Foundation 对象之间能够轻松的转换:
- 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下的内存管理
Core Foundation 对象必须使用CFRetain和CFRelease来进行内存管理。那么当使用Objective-C 和 Core Foundation 对象相互转换的时候,必须让编译器知道,究竟由谁来负责释放对象,是否交给ARC处理。仅仅有正确的处理。才干避免内存泄漏和double
free导致程序崩溃。
- __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;
- //正确的做法应该运行CFRelease
- //CFRelease(aCFString);
- }
程序没有运行CFRelease,造成内存泄漏:

- 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)viewDidLoad
- {
- [super viewDidLoad];
- CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
- NSString *aNSString = (__bridge NSString *)aCFString;
- 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 对象相互转换的内存管理总结
本文转载至 http://blog.csdn.net/allison162004/article/details/38756649 OS允许Objective-C 和 Core Foundation ...
- IOS开发之—— Core Foundation对象与OC对象相对转换的问题
对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...
- Objective-C对象与Core Foundation对象
Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并引用计数的对象.与Objective-C对象差别非常少.不管哪种框架生成的对象,一旦生成,便可在两 ...
- 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应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...
- iOS- Core Foundation对象与OC对象相对转换
对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...
随机推荐
- poj1035Spell checker
暴力解决. 先把字典里的每一个单词的长度存起来.在查找的时候.就比較长度,在多一个少一个之间找, #include<stdio.h> #include<string.h> #i ...
- HDU 1113 Word Amalgamation (map 容器 + string容器)
http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across ...
- html5开发手机打电话发短信功能,html5的高级开发,html5开发大全,html手机电话短信功能具体解释
在非常多的手机站点上,有打电话和发短信的功能,对于这些功能是怎样实现的呢.事实上不难,今天我们就用html5来实现他们. 简单的让你大开眼界.HTML5 非常easy写,但创建网页时,您常常须要反复做 ...
- angularjs1-7,供应商
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- linux下配置虚拟域名
linux下配置虚拟域名 1.hosts文件位置! /etc/hosts 2.增加一行 127.0.0.1 xxxxx 3.修改apache中的vhosts vi /etc/httpd/extra/h ...
- 英语发音规则---T字母
英语发音规则---T字母 一.总结 一句话总结: 1.T一般发[t]? ten [ten] num.十 letter [ˈletə(r)] n.信; 证书 meet [mi:t] vt.& v ...
- CodeForces--609C --Load Balancing(水题)
Load Balancing Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Subm ...
- 16. 3Sum Closest[M]最接近的三数之和
题目 Given an array nums of n integers and an integer target, find three integers in nums such that th ...
- POJ 2239 匈牙利算法
思路:最大匹配 也是很裸的一道题-. // by SiriusRen #include <cstdio> #include <cstring> #include <alg ...
- 利用keytool颁发https证书方法
1.首先生成私有认证机构 命令:keytool -genkeypair -alias CAname 补充:keytool -list 命令增加 -v 可以查看CA详细信息 2.然后生成私有证书 命 ...