Core Foundation(CFString为例)

转载 http://limboy.me/ios/2013/06/07/core-foundation.html

先来说说「Core Foundation」(以下简称CF)的历史吧。当年乔布斯被自己创办的公司驱逐后,成立了「NeXT Computer」,其实做的还是老本行:卖电脑,但依旧不景气。好在NeXTSTEP系统表现还不错,亏损不至于太严重。正好此时苹果的市场份额大跌,急需一个新的操作系统,结果大家都知道了,乔布斯借此收购,重新回到了苹果。

这里就牵扯到了一个问题,如何让旧有的系统(Mac OS 9)和NeXTSTEP合成为一个新系统?这就需要一个更为底层的核心库可以供Mac Toolbox和OPENSTEP双方调用。CF就这么诞生了。

CF是由C语言实现的,而不是Objective-C,所以如果用到了CF,就需要手动管理内存,ARC是无能为力的。当然因为CF和Foundation之间的友好关系,它们之间的管理权也是可以移交的,这个后面再说。

CF提供了基础功能,如CFString,CFDate,CFNumber等等,以CFString为例,CFString和NSString之间是什么关系?NSString其实是一个「类簇」,也就是抽象接口,所以String Objects并不是NSString实例,而是实现了NSString方法的私有类的实例,也就是CFString。

NSLog(NSStringFromClass([@"Some Class" class]));

# output __NSCFConstantString

同时NSStrings和CFStrings之间可以自由转换,也就是「toll free bridging」。比如:

CFStringRef aCFString = (CFStringRef)aNSString;
NSString *aNSString = (NSString *)aCFString;

因为编译器无法自动管理CF的内存,所以CF对象在使用完后,需要手动释放(CFRelease)。如果使用ARC来管理内存,苹果提供了3种方法来处理:

__bridge

__bridge只是在CF和OC之间传递指针,其他的事啥也没干,所以转换成CF时,还是要手动释放内存。

CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
NSString *aNSString = (__bridge NSString *)aCFString;  

(void)aNSString;  

CFRelease(aCFString);

_bridgeretained

_bridgeretained或者CFBridgingRetain(),将Objective-C对象转换为Core Foundation对象,把对象所有权桥接给Core Foundation对象,同时剥夺ARC的管理权,后续需要开发者使用CFRelease或者相关方法手动来释放对象。

_bridgetransfer

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

最后,因为CF是用C实现的,且处于下层,所以执行速度上会比Foundation稍微快一点,不过也就是一点点,几乎察觉不到。相比Foundation带来的ARC内存管理和更多的API,开发上的效率会大幅提升,所以还是尽量多的使用OC。

参考

时间: 2024-10-23 03:54:29

Core Foundation(CFString为例)的相关文章

《从零開始学Swift》学习笔记(Day60)——Core Foundation框架

创文章,欢迎转载.转载请注明:关东升的博客   Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.尽管在Swift中调用这样的C语言风格的API比較麻烦,可是在OS X和iOS开发过程中,有时候使用CoreFoundation框架的API是很方便的,比如在与C语言混合编码的时候. Core Foundation框架与Foundation框架紧密相关,他们具有与同样的接口,可是不同.Core Foundation框架是基于C语言

Core Foundation 框架

Core Foundation 框架 2013-12-08 22:52 1978人阅读 评论(0) 收藏 举报 目录(?)[+] 转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等) 程序包

Swift—Core Foundation框架-备

Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Swift中调用这种C语言风格的API比较麻烦,但是在OS X和iOS开发过程中,有时候使用CoreFoundation框架的API是非常方便的,例如在与C语言混合编码的时候. Core Foundation框架与Foundation框架紧密相关,他们具有与相同的接口,但是不同.Core Foundation框架是基于C语言风格的,而Foundation框架是基于Obje

Core Foundation框架(1)基础介绍

在开发过程中绝大多数时间使用的是UIKit和Foundation框架,UIKit提供诸如UIView和UIButton这类的控件,Foundation提供NSArray,NSDictionary这类的数据结构,两者结合可以解决大部分问题,但是有的时候需要底层框架,底层框架名字通常以Core开头,比如Core Text,Core Graphics和Core Video.它们都是以Core Foundation为基础的C语言的API. Core Foundation中类型都是不透明类型(opaque

ARC 误区 Core Foundation 中的内存泄露

ARC :只会对oc 对象进行内存管理,即:苹果有句名言:ARC is only for NSObject. 但是对c对象或是CG开头的对象,即存在于 Core Foundation框架 (CoreFoundation.framework 是一组C语言接口)中的对象无效,需要手动的retain 和release. 例如:CGImageRef 也是一个Image的指针,ARC不会进行处理. 使用ARC的项目,一般内存泄漏都是malloc.自定义结构.资源引起的,多注意这些地方进行分析. 例: 1

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

Objective-C 和 Core Foundation 对象相互转换的内存管理 iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString 和 CFStringRef 来说,直接转换豪无压力: CFStringRef aCFString = (CFStringRef)aNSString; NSString *aNSString = (NSString *)aCFString; 针对内存管理问题,ARC 可以帮忙管理 Objective-

《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

原创文章,欢迎转载.转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味着内存什么都不用管.Swift类型内存管理是采用ARC,Foundation类型和Core Foundation类型内存管理都是采用MRC或ARC,CoreFoundation类型内存管理是基于C语言风格的,它有一个对象所有权的概念. Objective-C的MRC内存管理 Core Fou

Objective-C对象与Core Foundation对象

Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并引用计数的对象.与Objective-C对象区别很少.无论哪种框架生成的对象,一旦生成,便可在两种框架中使用.这种转换不需要额外的CPU资源,因而也被称为"免费桥". /****************************(1)***********************/ /* CFTypeRef CFBridgingRetain(id X){ return (__bridge

Objective-C 和 Core Foundation 对象相互转换

iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换: CFStringRef aCFString = (CFStringRef)aNSString; NSString *aNSString = (NSString *)aCFString; 针对内存管理问题,ARC 可以帮忙管理 Objective-C 对象, 但是不支持 Core Foundation 对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象. 本文重点总结一下类型转换后的内存管理.