iOS中Foundation与Core Foundation的桥
分享是每个优秀的程序员所必备的品质
- 框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易
- 在OSX下的Mac操作系统中大约有80个框架。
Foundation框架
Foundation框架是日常iOS开发中常用的,它是Cocoa框架(事实上是一个框架的集合)重要的组成部分,也是为所有程序开发奠定基础的框架。
Foundation框架中大约有125个可用的头文件,允许使用一些基本对象(数字和字符串),以及一些对象结合(数组、字典和集合),其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、线程和RunLoop以及处理几何数据结构等。
Core Foundation框架
Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。
Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,不同的是Foundation框架提供Objective-C接口。而Core Foundation框架提供Objective-C接口。有时候开发会将Foundation对象和Core Foundation类型掺杂使用,这就需要使用桥接。
桥接
- 桥接就是在
Foundation框架中的对象
和Core Foundation框架中的变量
之间进行类型转换 -
Core Foundation
比Foundation
框架更加底层,是纯C语言的框架 -
Foundation
框架在Core Foundation
框架的基础上进行封装,增加了面向对象的思想
以字符串为例:
Foundation框架 :NSString *stringOC
;
Core Foundation框架 :CFStringRef stringC
;(不加*)
两个变量stringOC
和stringC
,Foundation框架中有NSString
类型,在Core Foundation框架中与之对应的是CFStringRef
类型
桥接的几种形式:
1、 __bridge type
__bridge
只进行类型转换,不转让对象的所有权
-
stringC = (__bridge CFStringRef)stringOC;
只是把stringOC
所指向对象的地址交给了stringC
,原来对象的所有权属于stringOC
,转换之后还是属于stringOC
,原来是由stringOC
管理的内存,现在还是由stringOC
管理,在ARC环境下,stringOC
可以自动释放 -
stringOC = (__bridge NSString *)stringC;
只是把stringC
所指向变量的地址交给了stringOC
,原来变量的所有权属于stringC
,转换之后还是属于stringC
,原来是由stringC
管理的内存,现在还是由stringC
管理,需要手动释放,调用CFRelease
方法
2、__bridge_retain CF type
strC = (__bridge_retain CFStringRef)strOC;
- 把
Foundation框架的对象
转换成Core Foundation框架的变量
- 同时转让对象的所有权,把对象的所有权从
stringOC
转移给stringC
,原来是由stringOC
管理的内存,现在让stringC
来管理,需要手动释放,调用CFRelease
方法
-
CFBridgingRetain
方法和它等价
3、__bridge_transfer Objective-C type
-
stringOC = (__bridge_transfer NSString*)stringC;
- 把
Core Foundation框架的变量
转换成Foundation框架的对象
- 同时转让变量的所有权,把变量的所有权从
stingrC
转移给stringOC
,原来是由stringC
管理的内存,现在让stringOC
来管理,在ARC环境下,stringOC
可以自动释放
- 把
-
CFBridgingRelease
方法和它等价