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. LCA【模板】

    #include <algorithm> #include <cstdio> #include <vector> #define N 10015 using nam ...

  2. Ubuntu12.04 下 GTK3.xx 的安装、编译和測试

    用此方法成功在UBUNTU 12.04下安装GTK 3.xxx. 一.安装 1.安装gcc/g++/gdb/make 等基本编程工具 $sudo apt-get install build-essen ...

  3. 【MongoDB】The basic operation of Index in MongoDB

    In the past four blogs, we attached importance to the index, including description and comparison wi ...

  4. ORM进阶之Hibernate中对象的三大状态解析

    ORM进阶之 ORM简单介绍 ORM进阶之Hibernate简单介绍及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 在Hibernatea中每一 ...

  5. Oracle 用户管理(一)

    1     创建用户     create user @username identified by @password     比如:create user aobama identified by ...

  6. codeforces Towers 题解

    Little Vasya has received a young builder's kit. The kit consists of several wooden bars, the length ...

  7. 巧用select延时

    在LINUX用户态的情况下.假设想要延时的话.用sleep是最合适的,可是,在有些情况下,须要更小单位的延时,ms  us 也是要的.用循环获取到的延时是不精确的. 幸好,select函数巧用的话,是 ...

  8. RecyclerView实现底部载入很多其它功能

    这两天在公司没有什么任务分配,就研究了下咱们Google在Android5.0 推出的一个用来取代ListView的列表控件----RecyclerView. 发现功能上确实比ListView强大了不 ...

  9. Caffe C++API 提取任意一张图片的特征系列二----MemoryData

    介绍一种更加灵活的方法,用MemoryData层输入数据,可以直接用opencv接口读入我们的图片再添加的网络中.  第一个问题:仍然是工程建立问题,提示卷积层或其他层没有注册,解决方法与上一篇博客一 ...

  10. [Swift]二进制、八进制、十进制、十六进制之间的转换

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...