Toll-Free Brige:解决Foundation与Core Foundation之间的类型转换

Core Foundation框架和Foundation框架有很多数据类型是可以相互转换的,这种能力叫做toll-free bridging。这意味着你可以使用同一种类型的数据作为Core Foundation函数调用的参数,同时作为Objective-C消息的返回值。例如NSLocale对应CFLocaleRef,但是并非所有的数据类型都是toll-free bridged,即使它们的名字显得它们似乎是可以的。例如NSRunLoop和CFRunLoop,NSBundle和CFBundle,NSDateFormatter和CFDateFormatter。

转换时需要给编译器提供以下信息:

  • you have to cast one type to the other(类型强制转换)
  • you may have to indicate the object lifetime semantics(提供对象生命周期的语义)

编译器并不会自动管理Core Foundation对象的生命周期,你需要使用类型强制转换或者Core Foundation样式的宏来告诉编译器对象的所有权语义。

__bridge

不交付所有权,只在Objective-C和Core Foundation 之间转换指针

__bridge_retained / CFBridgingRetain

将Objective-C指针交付给Core Foundation,同时将所有权转移给Core Foundation,必须调用CFRelease或者相关的函数来释放所有权

__bridge_transfer / CGBridgingRelease

将非Objective-C指针交付给Objective-C,同时将所有权转移给ARC

tips:Core Foundation中凡是copy create之类的关键词的,要注意Release,同时转换成OC时要注意__bridge_transfer或者CGBridgingRelease()

示例1:

 1 NSLocale *gbNSLocale = [[NSLocale alloc]   initWithLocaleIdentifier:@"en_GB"];
 2 CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;
 3 CFStringRef cfIdentifier = CFLocaleGetIdentifier(gbCFLocale);
 4 NSLog(@"cfIdentifier: %@", (__bridge NSString *)cfIdentifier);
 5 // Logs: "cfIdentifier: en_GB"
 6 CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
 7 NSLocale *myNSLocale = (NSLocale *)CFBridgingRelease(myCFLocale);
 8 NSString *nsIdentifier = [myNSLocale localeIdentifier];
 9 CFShow((CFStringRef)[@"nsIdentifier: " stringByAppendingString:nsIdentifier]);
10 // Logs identifier for current locale

示例2:

 1 - (void)drawRect:(CGRect)rect {
 2     CGContextRef ctx = UIGraphicsGetCurrentContext();
 3     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
 4     CGFloat locations[2] = {0.0, 1.0};
 5     NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
 6     [colors addObject:(id)[[UIColor lightGrayColor] CGColor]];
 7     CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);
 8     CGColorSpaceRelease(colorSpace);  // Release owned Core Foundation object.
 9
10     CGPoint startPoint = CGPointMake(0.0, 0.0);
11     CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds));
12     CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint,kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
13     CGGradientRelease(gradient);  // Release owned Core Foundation object.
14 }
时间: 2024-11-07 17:41:07

Toll-Free Brige:解决Foundation与Core Foundation之间的类型转换的相关文章

Core Foundation(CFString为例)

转载 http://limboy.me/ios/2013/06/07/core-foundation.html 先来说说「Core Foundation」(以下简称CF)的历史吧.当年乔布斯被自己创办的公司驱逐后,成立了「NeXT Computer」,其实做的还是老本行:卖电脑,但依旧不景气.好在NeXTSTEP系统表现还不错,亏损不至于太严重.正好此时苹果的市场份额大跌,急需一个新的操作系统,结果大家都知道了,乔布斯借此收购,重新回到了苹果. 这里就牵扯到了一个问题,如何让旧有的系统(Mac

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

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

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

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》学习笔记(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

Objective-C对象与Core Foundation对象

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

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应用程序提供基本数据管理和服务功能.下面列举该框架支持进行管理的数据以及可提供的服务: 群体数据类型 (数组.集合等) 程序包

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

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