说说Core Foundation

转载 2016年06月02日 10:09:02

转自:Limboy's HQ

先来说说「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;  

(博主添加:)CocoaFoundation指针与CoreFoundation指针转换,需要考虑的是所指向对象所有权的归属。ARC提供了3个修饰符来管理。

1. __bridge,什么也不做,仅仅是转换。此种情况下:

i). 从Cocoa转换到Core,需要人工CFRetain,否则,Cocoa指针释放后, 传出去的指针则无效。

ii). 从Core转换到Cocoa,需要人工CFRelease,否则,Cocoa指针释放后,对象引用计数仍为1,不会被销毁。

2. __bridge_retained,转换后自动调用CFRetain,即帮助自动解决上述i的情形。

3. __bridge_transfer,转换后自动调用CFRelease,即帮助自动解决上述ii的情形。


因为编译器无法自动管理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。


参考



苹果的CoreFoundation部分源代码

地址在http://opensource.apple.com/source/CF/CF-855.14/
  • heikefangxian23
  • heikefangxian23
  • 2016年04月07日 15:06
  • 1562

介绍 Windows Presentation Foundation

介绍 Windows Presentation Foundation   WPF 是一个库,为开发用户界面提供了全新的模型,用它创建桌面的应用程序比使用 Windows 窗体更有优势;WPF 还提供了...
  • hadstj
  • hadstj
  • 2014年05月04日 21:58
  • 4633

OC基础---Core Foundation和Cocoa Foundation

先来说说「Core Foundation」(以下简称CF)的历史吧。当年乔布斯被自己创办的公司驱逐后,成立了「NeXT Computer」,其实做的还是老本行:卖电脑,但依旧不景气。好在NeXTSTE...
  • TinmKing034
  • TinmKing034
  • 2014年05月23日 16:48
  • 470

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

创文章,欢迎转载。转载请注明:关东升的博客  Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API。虽然在Swift中调用这种C语言风...
  • tonny_guan
  • tonny_guan
  • 2016年01月15日 10:41
  • 2237

Core Foundation 与 cocoa Foundation框架区别

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

Toll-Free Bridging详解——CoreFoundation和Foundation框架的无损桥接

所谓的OC中的Toll-Free Bridging就是用来很完美的连通两个框架,我们编程上称之为“无损桥接”。 有一些数据类型是能够在 Core Foundation Framework 和 Foun...
  • miscellaner
  • miscellaner
  • 2015年01月30日 21:31
  • 859

Core Foundation内存管理

Core Foundation内存管理 发表于 2011 年 11 月 23 日 由 ミ寒寒草 我的理解CoreFoundation是一堆C语言API的集合。内存管理和Objective C感...
  • chuanyituoku
  • chuanyituoku
  • 2013年11月27日 14:02
  • 854

CoreFoundation框架

财务项目iPad前端开的学习
  • sindyIntel
  • sindyIntel
  • 2014年08月17日 18:15
  • 224

Objective-C对象和Core Foundation 对象

Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并使用引用计数的对象。在ARC无效时,Core Foundation 框架中的retain/rele...
  • Shave_Kevin
  • Shave_Kevin
  • 2015年07月22日 09:52
  • 404

Foundation对象与Core Foundation对象间的转换:Toll-Free Birdge

作为iOS开发人员,却对iOS开发中用到的框架分不清楚,比如说Core Foundation和Foundation,只是知道在这两者之间需要用__bridge进行转换,却没有去具体的研究一下。今天就记...
  • dp948080952
  • dp948080952
  • 2016年11月27日 20:33
  • 261
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:说说Core Foundation
举报原因:
原因补充:

(最多只允许输入30个字)