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应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务:

  • 群体数据类型 (数组、集合等)
  • 程序包
  • 字符串管理
  • 日期和时间管理
  • 原始数据块管理
  • 偏好管理
  • URL及数据流操作
  • 线程和RunLoop
  • 端口和soket通讯

Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。如 果您将Foundation对象和Core Foundation类型掺杂使用,则可利用两个框架之间的 “toll-free bridging”。所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。很多数据类型支持这一特性,其中包括群体和字符串数据类型。每个框架的类和类型描述都会对某个对象是否为 toll-free bridged,应和什么对象桥接进行说明。

如需进一步信息,请阅读Core Foundation 框架参考

引子

  1. id obj = [[NSObject alloc] init];
  2. void *p = obj;
  1. id obj = p;
  2. [obj release];
  1. error: implicit conversion of an Objective-C pointer
  2. to ’void *’ is disallowed with ARC
  3. void *p = obj;
  4. ^
  5. error: implicit conversion of a non-Objective-C pointer
  6. type ’void *’ to ’id’ is disallowed with ARC
  7. id o = p;
  8. ^

__bridge

__bridge 关键字来实现id类型与void*类型的相互转换。看下面的例子。

  1. id obj = [[NSObject alloc] init];
  2. void *p = (__bridge void *)obj;
  3. id o = (__bridge id)p;

除过 __bridge 以外,还有两个 __bridge 相关的类型转换关键字:

    __bridge_retained

  • __bridge_transfer

__bridge_retained

  1. id obj = [[NSObject alloc] init];
  2. void *p = (__bridge_retained void *)obj;
  1. id obj = [[NSObject alloc] init];
  2. void *p = obj;
  3. [(id)p retain];
  1. void *p = 0;
  2. {
  3. id obj = [[NSObject alloc] init];
  4. p = (__bridge_retained void *)obj;
  5. }
  6. NSLog(@"class=%@", [(__bridge id)p class]);

__bridge_transfer

如果ARC无效的时候,我们可能需要写下面的代码。

  1. // p 变量原先持有对象的所有权
  2. id obj = (id)p;
  3. [obj retain];
  4. [(id)p release];
  1. // p 变量原先持有对象的所有权
  2. id obj = (__bridge_transfer id)p;

1。

Toll-Free bridged

这两种对象间可以互相转换和操作,不使用ARC的时候,单纯的用C原因的类型转换,不需要消耗CPU的资源,所以叫做 Toll-Free bridged。比如 NSArray和CFArrayRef, NSString和CFStringRef,他们虽然属于不同的 Framework,但是具有相同的对象结构,所以可以用标准C的类型转换。

  1. NSString *string = [NSString stringWithFormat:...];
  2. CFStringRef cfString = (CFStringRef)string;

但是在ARC有效的情况下,将出现类似下面的编译错误:

  1. Cast of Objective-C pointer type ‘NSString *’ to C pointer type ‘CFStringRef’ (aka ‘const struct __CFString *’) requires a bridged cast
  2. Use __bridge to convert directly (no change in ownership)
  3. Use __bridge_retained to make an ARC object available as a +1 ‘CFStringRef’ (aka ‘const struct __CFString *’)

正因为Objective-C是ARC管理的对象,而Core Foundation不是ARC管理的对象,所以才要特意这样转换,这与id类型向void*转换是一个概念。也就是说,当这两种类型(有ARC管理,没 有ARC管理)在转换时,需要告诉编译器怎样处理对象的所有权。

  1. NSString *string = [NSString stringWithFormat:...];
  2. CFStringRef cfString = (__bridge CFStringRef)string;
  1. NSString *string = [NSString stringWithFormat:...];
  2. CFStringRef cfString = (__bridge_retained CFStringRef)string;
  3. ...
  4. CFRelease(cfString); // 由于Core Foundation的对象不属于ARC的管理范畴,所以需要自己release

实际上,Core Foundation 内部,为了实现Core Foundation对象类型与Objective-C对象类型的相互转换,提供了下面的函数。

  1. CFTypeRef CFBridgingRetain(id X) {
  2. return (__bridge_retained CFTypeRef)X;
  3. }
  4. id CFBridgingRelease(CFTypeRef X) {
  5. return (__bridge_transfer id)X;
  6. }
  1. NSString *string = [NSString stringWithFormat:...];
  2. CFStringRef cfString = CFBridgingRetain(string);
  3. ...
  4. CFRelease(cfString); // 由于Core Foundation不在ARC管理范围内,所以需要主动release。

__bridge_transfer

  1. CFStringRef cfString = CFStringCreate...();
  2. NSString *string = (__bridge_transfer NSString *)cfString;
  3. // CFRelease(cfString); 因为已经用 __bridge_transfer 转移了对象的所有权,所以不需要调用 release
  1. CFStringRef cfString = CFStringCreate...();
  2. NSString *string = CFBridgingRelease(cfString);

总结

  • 明确被转换类型是否是 ARC 管理的对象

    • Core Foundation 对象类型不在 ARC 管理范畴内
    • Cocoa Framework::Foundation 对象类型(即一般使用到的Objectie-C对象类型)在 ARC 的管理范畴内
  • 如果不在 ARC 管理范畴内的对象,那么要清楚 release 的责任应该是谁
  • 各种对象的生命周期是怎样的


1. 声明 id obj 的时候,其实是缺省的申明了一个 __strong 修饰的变量,所以编译器自动地加入了 retain
的处理,所以说 __bridge_transfer 关键字只为我们做了 release 处理。

时间: 2025-01-02 01:30:35

Core Foundation 框架的相关文章

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

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

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

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

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

IOS之Core Foundation框架和Cocoa Foundation框架的区别

Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等) 程序包 字符串管理 日期和时间管理 原始数据块管理 偏好管理 URL及数据流操作 线程和RunLoop 端口和soket通讯 Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objec

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

Core Foundation框架(2)命名规范,内省

命名规则中最重要的就是Create Rule,官方说明如下: There is an important distinction between Get, and Copy and Create, in names of functions that return values. If you use a Get function, you cannot be certain of the returned object’s life span. To ensure the persistenc

《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象

原创文章,欢迎转载.转载请注明:关东升的博客 内存托管对象 Swift中调用CoreFoundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象. 内存托管对象就是由编译器帮助管理内存,我们不需要调用CFRetain函数获得对象所有权,也不需要调用CFRelease函数放弃对象所有权. 获得这些内存托管对象的方法,是采用了CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED注释声明,示例代码: -(CGPathRef)makeToPath CF_

Foundation框架—结构体

一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了. 即#import<foundation/foundation.h> 补充:core foundation框架相对底层,里面的代码几乎都是c语言的,而foundation中是OC的. 二.常用的结构体介绍及简单使用 常用的结构体: (一)NSRang的基本使用 创建变量 (二)NSPo

Objective-C对象与Core Foundation对象

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