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. poj1035Spell checker

    暴力解决. 先把字典里的每一个单词的长度存起来.在查找的时候.就比較长度,在多一个少一个之间找, #include<stdio.h> #include<string.h> #i ...

  2. HDU 1113 Word Amalgamation (map 容器 + string容器)

    http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across ...

  3. html5开发手机打电话发短信功能,html5的高级开发,html5开发大全,html手机电话短信功能具体解释

    在非常多的手机站点上,有打电话和发短信的功能,对于这些功能是怎样实现的呢.事实上不难,今天我们就用html5来实现他们. 简单的让你大开眼界.HTML5 非常easy写,但创建网页时,您常常须要反复做 ...

  4. angularjs1-7,供应商

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  5. linux下配置虚拟域名

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

  6. 英语发音规则---T字母

    英语发音规则---T字母 一.总结 一句话总结: 1.T一般发[t]? ten [ten] num.十 letter [ˈletə(r)] n.信; 证书 meet [mi:t] vt.& v ...

  7. CodeForces--609C --Load Balancing(水题)

    Load Balancing Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Subm ...

  8. 16. 3Sum Closest[M]最接近的三数之和

    题目 Given an array nums of n integers and an integer target, find three integers in nums such that th ...

  9. POJ 2239 匈牙利算法

    思路:最大匹配 也是很裸的一道题-. // by SiriusRen #include <cstdio> #include <cstring> #include <alg ...

  10. 利用keytool颁发https证书方法

    1.首先生成私有认证机构 命令:keytool -genkeypair -alias CAname   补充:keytool -list 命令增加 -v 可以查看CA详细信息 2.然后生成私有证书 命 ...