在cocoa application的应用中,我们有时会使用Core Foundation(CF),我们经常会在Objective-C和CF之间进行转化。系统使用arc的状态下,编译器不能自动管理CF的内存,这时候你必须使用CFRetain和CFRelease来进行CF的内存的管理。

具体的CF内存管理规则见: Memory Management Programming Guide for Core Foundation
在OC和FC之间进行转化的时候,主要是对象的归属问题。共有两种方式:
1、使用宏,可以标识归属者从OC到CF,还是从CF到OC。
NS_INLINE CFTypeRef CFBridgingRetain(id X) { 
return (__bridge_retain CFTypeRef)X; 
NS_INLINE id CFBridgingRelease(CFTypeRef X) { 
return (__bridge_transfer id)X; 
}
2、使用转化符,如:__bridge,__bridge_transfer,__bridge_retained
id my_id; 
CFStringRef my_cfref; 
… 
NSString   *a = (__bridge NSString*)my_cfref;     // Noop cast. 
CFStringRef b = (__bridge CFStringRef)my_id;      // Noop cast. 
… 
NSString   *c = (__bridge_transfer NSString*)my_cfref; // -1 on the CFRef 
CFStringRef d = (__bridge_retained CFStringRef)my_id;  // returned CFRef is +1
下面以详细的例子来介绍一下OC和CF在arc下内存管理的详细写法.下面以CFURLCreateStringByAddingPercentEscapes()函数为例说一下在ARC下的写法和非ARC下的写法。
非ARC模式下的写法:
#pragma mark – View lifecycle 
- (void)viewDidLoad 
[super viewDidLoad]; 
NSLog(@"=%@", [self escape:@"wangjun"]); 
-(NSString *)escape:(NSString *)text 
return (NSString *)CFURLCreateStringByAddingPercentEscapes( 
NULL, 
(__bridge CFStringRef)text, 
NULL, 
CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));; 
}
使用instruments检测,没有内存泄漏。
下面把上面工程改为arc模式。
可以看到xcode自动把上面函数转化为:
#pragma mark – View lifecycle 
- (void)viewDidLoad 
[super viewDidLoad]; 
NSLog(@"=%@", [self escape:@"wangjun"]); 
-(NSString *)escape:(NSString *)text 
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes( 
NULL, 
(__bridge CFStringRef)text, 
NULL, 
CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));; 
}
在arc中,CF和OC之间的转化桥梁是 __bridge,有两种方式:
__bridge_transfer  ARC接管管理内存
__bridge_retained  ARC释放内存管理
上面的方法是从CF转化为OC NSString对象,使用的__bridge_transfer ,对象所有者发生转变,由CF到OC,最后由ARC接管内存管理。运行上面的代码,用instruments检测,是没有内存泄漏的。
上面代码等同于:
- (NSString *)escape:(NSString *)text 
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( 
NULL, 
(__bridge CFStringRef)text, 
NULL, 
CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));}
如果将上述代码改为:
-(NSString *)escape:(NSString *)text 
return (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes( 
NULL, 
(__bridge CFStringRef)text, 
NULL, 
CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));; 
}
编译也会成功,但是这时候用instruments检测,可以发现内存泄漏:
由于CF转化完OC,没有自己释放内存,同时也没有把内存管理交给ARC,所以出现内存泄漏。由于__bridge只是同一个对象的引用,内存的所有权没有发生变化。
下面在说一下oc到CF的转化,需要把OC的内存管理权释放掉。
NSString *s1 = [[NSString alloc] initWithFormat:@"Hello, %@!", name]; 
CFStringRef s2 = (__bridge_retained CFStringRef)s1; 
// do something with s2 // . . . 
CFRelease(s2);
最后由CF进行内存释放。
上面代码等同于:
CFStringRef s2 = CFBridgingRetain(s1); 
// . . . 
CFRelease(s2);
下面总结一下我们使用ARC情况下。oc和CF互相转化的原则:
CF转化为OC时,并且对象的所有者发生改变,则使用CFBridgingRelease()或__bridge_transfer 。
OC转化为CF时,并且对象的所有者发生改变,则使用CFBridgingRetain()或__bridge_retained
当一个类型转化到另一种类型时,但是对象所有者没有发生改变,则使用__bridge.

Foundation和Core Foundation掺杂使用桥接 Toll-Free Bridging相关推荐

  1. Core Foundation框架

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

  2. Core Foundation 与 cocoa Foundation框架区别

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

  3. AUTOSAR FOUNDATION文档——Foundation Release Overview

    1. 介绍 1.1 文档范围 本文档提供了AUTOSAR标准基础版本的概述R19-11. 1.2 AUTOSAR标准 1.2.1 介绍 AUTOSAR用它的标准处理汽车软件开发中的广泛用例.这些用例有 ...

  4. 【Mac Technology Overview】(五)Core Services Layer

    [Mac Technology Overview](五)Core Services Layer 核心服务层 文章目录 [Mac Technology Overview](五)Core Services ...

  5. IOS开发之__bridge,__bridge_transfer和__bridge_retained

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

  6. iOS iPhone SDK 包含哪些东西?

    From: http://www.cnblogs.com/jy578154186/archive/2013/02/27/2934881.html iPhone SDK 包含哪些东西? 第一部分: 在使 ...

  7. iPhone SDK 包含哪些东西

    ? 原文地址:http://www.cnblogs.com/jy578154186/archive/2013/02/27/2934881.html 第一部分: 在使用Intel芯片的Macintosh ...

  8. iPhone SDK 包含哪些东西?

    iPhone SDK 包含哪些东西? 第一部分: 在使用Intel芯片的Macintosh计算机开发iOS应用程序所需的全部接口.工具以及资源全都包含于iPhone SDK. 苹果公司将大部分系统接口 ...

  9. 从0开始学Swift笔记整理(五)

    这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...

最新文章

  1. unity3d Update()和FixedUpdate()的区别
  2. ZABBIX作集中式NGINX性能监控的注意要点
  3. angularjs directive 的几点使用技巧
  4. Dev GridView 绑定Listlt;Tgt;、BindingList lt;Tgt;、BindingSource
  5. insert 多条数据 并且具有唯一标识符
  6. Exps on March 21st
  7. 实验八 java多线程操作_20182310实验八实验报告
  8. Golang关于channel死锁情况的汇总以及解决方案
  9. Android百度SDK定位
  10. Python进阶(九)常用高级函数Counter、defaultdict、nametuple、map、reduce、filter、groupby
  11. “工作5年,存款为0”:那些拼命的人是怎么被拖垮的?
  12. XPath解析网页学习笔记
  13. 国人创造中文编程语言的优势
  14. [Python][Scrapy] Scrapy 官方文档
  15. flask-uploads
  16. 佛山科学技术学院计算机科学与技术李欣华,第七届国务院学位委员会中文学科评议组2019年度 扩大会议在佛山科学技术学院召开...
  17. USRP X310 Windows烧录
  18. 嵌入式应用-详解移植并使用freetype显示文字
  19. 熔断器Hystrix
  20. APA规划和控制算法开发遇到的问题及解决方案

热门文章

  1. html font-family设置无效,css设置中文字体(font-family:黑体)后样式失效问题
  2. android viewpager 滑动方法,Android中Viewpager禁止滑动的实现
  3. java中demo接人_return的用法_如何理解java中return的用法?
  4. javaweb上传文件_javaWeb中,如何通过CommonsFileUpload组件上传文件
  5. 电脑连接电视方法详解_电脑如何连网?——校园宽带的连接方法(详解版)
  6. python 爬虫 selenium
  7. linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  8. 单调队列优化和决策单调性优化
  9. 【UOJ#188】Sanrd(min_25筛)
  10. PS批量修改照片大小