Core Foundation(CF), 扫盲

转载 2013年12月05日 16:53:05

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

具体的CF内存管理规则见: Memory Management Programming Guide for Core Foundation


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,应和什么对象桥接进行说明。


在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));; 
}

总结

由上面的学习我们了解到 ARC 中类型转换的用法,那么我们实际使用中按照怎样的原则或者方法来区分使用呢,下面我总结了几点关键要素。

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

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

更多0



CNCF启动Kubernetes一致性认证计划,32家云系统及平台厂商获得通过

负责为Kubernetes以及Prometheus等开源技术提供支持与集成助力的云原生计算基金会( Cloud Native Computing Foundation®,简称CNCF®)今天宣布推出K...
  • M2l0ZgSsVc7r69eFdTj
  • M2l0ZgSsVc7r69eFdTj
  • 2017年11月19日 00:00
  • 138

OpenWRT开发之——远程debug

摘要 在目标机上安装gdbserver,并进行远程调试。 想要用gdb对OpenWrt进行远程调试。首先得在OpenWrt目标机上安装gdbserver。 其实在trunk路径下也有...
  • haifengid
  • haifengid
  • 2016年06月29日 16:33
  • 854

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

原创文章,欢迎转载。转载请注明:关东升的博客  内存托管对象Swift中调用CoreFoundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象。内存托管对象就是由编译器帮助管理内存,...
  • tonny_guan
  • tonny_guan
  • 2016年01月20日 10:19
  • 2104

深度学习之从零带你入门(扫盲篇)

一、基本概念扫盲 人工智能、机器学习、神经网络、深度学习这些字眼相信一些人都见过,但是并不知道他们之间的关系,这里本人整理相关资料后给出较为准确的定义。 这里大家先看如下一张图: 正如上图所示,...
  • z4909801
  • z4909801
  • 2017年10月30日 22:38
  • 179

【机器学习算法-python实现】协同过滤(cf)的三种方法实现

(转载请注明出处:http://blog.csdn.net/buptgshengod)
  • gshengod
  • gshengod
  • 2014年05月16日 11:47
  • 4951

Foundation对象与Core Foundation对象如何转换

1.Foundation对象与Core Foundation对象有什么区别   Foundation框架是使用OC实现的,Core Foundation是使用C实现的,Foundation对象 和 C...
  • mingdingzheng125
  • mingdingzheng125
  • 2015年10月17日 10:20
  • 143

Media Foundation学习笔记(一)重要概念

学习Media Foundation之前需要理解以下几个重要概念。 (一)流 定义:一个使用一致类型的媒体数据序列。例如:视频、音频、文本、脚本命令、静止图片等。 通常一个媒体文件包...
  • chenchong_219
  • chenchong_219
  • 2015年03月14日 20:19
  • 1961

Foundation框架解析

字符串(NSString与NSMutableString)创建字符串int main(int argh, char * argv[]) { @autoreleasepool { ...
  • github_33393668
  • github_33393668
  • 2016年02月24日 13:18
  • 587

数字证书及CA的扫盲介绍

转载:http://kb.cnblogs.com/page/194742/ ★ 先说一个通俗的例子   考虑到证书体系的相关知识比较枯燥、晦涩。俺先拿一个通俗的例子来说事儿...
  • zhangxinrun
  • zhangxinrun
  • 2015年07月17日 14:18
  • 2845

Storage foundation卷管理及主要进程

【IT168 专稿】本文主要讲述Storage Foundation卷管理的体系结构,以及Storage Foundation的进程介绍,包括卷管理相关的以及一些Storage Foundation其...
  • keane822
  • keane822
  • 2016年01月11日 13:30
  • 755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Core Foundation(CF), 扫盲
举报原因:
原因补充:

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