iOS同意Objective-C 和 Core Foundation 对象之间能够轻松的转换:

  1. CFStringRef aCFString = (CFStringRef)aNSString;
  2. NSString *aNSString = (NSString *)aCFString;

针对内存管理问题,ARC 能够帮忙管理 Objective-C 对象, 可是不支持 Core Foundation 对象的管理。所以转换后要注意一个问题:谁来释放使用后的对象。 本文重点总结一下类型转换后的内存管理。

一、非ARC的内存管理

倘若不使用ARC。手动管理内存,思路比較清晰,使用完,release转换后的对象就可以。

  1. //NSString 转 CFStringRef
  2. CFStringRef aCFString = (CFStringRef) [[NSString alloc] initWithFormat:@"%@", string];
  3. //...
  4. CFRelease(aCFString);
  5. //CFStringRef 转 NSString
  6. CFStringRef aCFString = CFStringCreateWithCString(kCFAllocatorDefault,
  7. bytes,
  8. NSUTF8StringEncoding);
  9. NSString *aNSString = (NSString *)aCFString;
  10. //...
  11. [aNSString release];

二、ARC下的内存管理


ARC的诞生大大简化了我们针对内存管理的开发工作。可是仅仅支持管理 Objective-C 对象, 不支持 Core Foundation 对象。

Core Foundation 对象必须使用CFRetain和CFRelease来进行内存管理。那么当使用Objective-C 和 Core Foundation 对象相互转换的时候,必须让编译器知道,究竟由谁来负责释放对象,是否交给ARC处理。仅仅有正确的处理。才干避免内存泄漏和double
free导致程序崩溃。


依据不同需求,有3种转换方式
  • __bridge                  (不改变对象全部权)
  • __bridge_retained 或者 CFBridgingRetain()              (解除 ARC 全部权)

  • __bridge_transfer 或者 CFBridgingRelease()            (

    给予 ARC 全部权)


1. __bridge_retained 或者 CFBridgingRetain()


__bridge_retained 或者 CFBridgingRetain()  将Objective-C对象转换为Core Foundation对象,把对象全部权桥接给Core Foundation对象,同一时候剥夺ARC的管理权。兴许须要开发人员使用CFRelease或者相关方法手动来释放对象。


来看个样例:

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
  5. CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
  6. //正确的做法应该运行CFRelease
  7. //CFRelease(aCFString);
  8. }

程序没有运行CFRelease,造成内存泄漏:






CFBridgingRetain()  是 __bridge_retained 的宏方法。以下两行代码等价:

  1. CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
  2. CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString);




2. __bridge_transfer 或者 CFBridgingRelease()


__bridge_transfer 或者 CFBridgingRelease()  将非Objective-C对象转换为Objective-C对象,同一时候将对象的管理权交给ARC。开发人员无需手动管理内存。


接着上面那个内存泄漏的样例,再转成OC对象交给ARC来管理内存,无需手动管理,也不会出现内存泄漏:

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
  5. CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
  6. aNSString = (__bridge_transfer NSString *)aCFString;
  7. }

CFBridgingRelease() 是__bridge_transfer的宏方法。以下两行代码等价:


  1. aNSString = (__bridge_transfer NSString *)aCFString;
  2. aNSString = (NSString *)CFBridgingRelease(aCFString);

3. __bridge


__bridge 仅仅做类型转换。不改变对象全部权。是我们最经常使用的转换符。

从OC转CF,ARC管理内存:

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
  5. CFStringRef aCFString = (__bridge CFStringRef)aNSString;
  6. }
从CF转OC,须要开发人员手动释放,不归ARC管: 
  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
  5. NSString *aNSString = (__bridge NSString *)aCFString;
  6. CFRelease(aCFString);
  7. }

Objective-C 和 Core Foundation 对象相互转换的更多相关文章

  1. Objective-C:Objective-C 和 Core Foundation 对象相互转换的内存管理

    Objective-C 和 Core Foundation 对象相互转换的内存管理 iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString ...

  2. Objective-C 和 Core Foundation 对象相互转换的内存管理总结

    本文转载至 http://blog.csdn.net/allison162004/article/details/38756649 OS允许Objective-C 和 Core Foundation ...

  3. IOS开发之—— Core Foundation对象与OC对象相对转换的问题

    对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...

  4. Objective-C对象与Core Foundation对象

    Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并引用计数的对象.与Objective-C对象差别非常少.不管哪种框架生成的对象,一旦生成,便可在两 ...

  5. OC对象与Core Foundation对象的转换

    OC对象使用了ARC,自己主动释放内存,可是CF中的对象没有ARC,必需要手动进行引用计数和内存释放. 两者对象之间的互相转换有三种形式: 1.__bridge: 直接转换,部改变对象的持有状况: i ...

  6. Core Foundation框架

    转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...

  7. Foundation与Core Foundation内存管理基本原则简述

    内存管理是一个十分重要的事情,稍有不慎就会发生内存泄漏或者是野指针的错误.内存泄漏一般表示没有任何指针指向的内存区域,由于这块内存在对象图中无法查找到,所以有可能永远都无法回收,如果内存泄漏的空间比较 ...

  8. Core Foundation 框架

    Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的 ...

  9. iOS- Core Foundation对象与OC对象相对转换

    对ARC盲目依赖的同学: 1过度使用block后,无法解决循环引用问题 2遇到底层Core Foundation对象,需要自己手工管理它们的引用计数时,显得一筹莫展 first:对于底层Core Fo ...

随机推荐

  1. nodejs-NPM基本使用

    搜索模块 npm search express 更新模块 npm update express 卸载模块 npm uninstall express 安装模块 npm install express ...

  2. 洛谷 U3346 A1-偶回文数

    U3346 A1-偶回文数 题目背景 方方方很喜欢回文数,于是zzq就出了一道关于回文数的题目. 因为偶回文数比较简单,所以方方方就把它放在了第一题... 题目描述 我们定义一个长度为偶数的回文数叫做 ...

  3. 开启WIFI

    C:\Windows\system32>netsh wlan set hostednetwork mode=allow ssid=wuyechun-wifi k ey= 承载网络模式已设置为允许 ...

  4. Oracle配置网络服务

    对于Oracle来说.不管是连接本地数据库还是远程连接server数据库,都须要在本机配置网络服务才可连接. 大家可能不明确为什么. 先拿SqlServer来说.SqlServer在连接数据库的时候仅 ...

  5. IOS之UITableView——怎样刷新父页面的Cell

    问题:评论数同步 在社交相关的项目中常常有这种主页面,主列表的Cell中有赞数.评论数,详情页顶部也是相同的一个Cell,下部有评论列表,评论添加或降低.详情页的评论数随之改变,返回主列表,主列表的相 ...

  6. godoc工具使用

    golang除了语言有一定的规范外,对于文档的生成也是非常不错的.仅仅要按go的格式来写的程序,都能够非常easy的生成文档. godoc命令介绍: http://golang.org/cmd/god ...

  7. 0x02 枚举、模拟、递推

    1.TYVJ1266(这站是不是已经倒闭了啊) USACO陈年老题,对于这种开关问题啊,最多只按一次,而且第一行随便按完下面的就全确定了,类似的还有固定翻转一个长度的区间,这个也是最多翻一次的而且翻的 ...

  8. linux下配置虚拟域名

    linux下配置虚拟域名 1.hosts文件位置! /etc/hosts 2.增加一行 127.0.0.1 xxxxx 3.修改apache中的vhosts vi /etc/httpd/extra/h ...

  9. 2017第33周四JDK8并发

    Java 8在Lambda表达式.接口默认方式.新的日期API等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进.以往的几个Java版本都对java.util.concurrent做了不同 ...

  10. Hadoop 三剑客之 —— 分布式文件存储系统 HDFS

    一.介绍 二.HDFS 设计原理     2.1 HDFS 架构     2.2 文件系统命名空间     2.3 数据复制     2.4 数据复制的实现原理     2.5 副本的选择     2 ...