深入了解Objective-C 和 Core Foundation 对象相互转换(_bridge)

介绍Core Foundation框架

Core Foundation是使用C实现的,它们为iOS应用程序提供基本数据管理和服务功能;

下面列举该框架支持进行管理的数据以及可提供的服务:
1、群体数据类型 (数组、集合等)
2、程序包
3、字符串管理
4、日期和时间管理
5、原始数据块管理
6、偏好管理
7、URL及数据流操作
8、线程和RunLoop
9、端口和soket通讯

特别注意的是:
针对内存管理问题,ARC 可以帮忙管理 Objective-C 对象, 但是不支持Core Foundation 对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象。

二者之间联系

他们虽然属于不同的 Framework,但是具有相同的对象结构,所以可以用标准C的类型转换。

Foundation 对象和 Core Foundation对象间的转换:俗称桥接 bridge

Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。

如果您将Foundation对象和Core Foundation类型掺杂使用,则可利用两个框架之间的 “toll-free bridging”。

所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core FoundatioFoundation 框架中的某些类型。

很多数据类型支持这一特性,其中包括群体和字符串数据类型。
每个框架的类和类型描述都会对某个对象是否为 toll-free bridged,应和什么对象桥接进行说明。
如需进一步信息,请阅读Core Foundation框架参考。

非ARC环境下的转换

本项目是ARC环境下的,创建一个非ARC的BridgeMRCNSObject文件。

#import "BridgeMRC.h"

@implementation BridgeMRC

- (void)forExample{

    NSString *aNNstring = @"hello world";

    CFStringRef aCFString = (CFStringRef)aNNstring;

    NSString *aString = (NSString *)aCFString;

    NSLog(@"%@",aString);

    [aNNstring release];

}
@end

我们在控制台看下结果:

我们会发现,真的只是单纯的转化,地址并没有变。
其实不测试也会是如此,毕竟没有new,只是转化而已。

最后不要忘记这是MRC环境下,要手动release

ARC环境下的转换

ARC的诞生大大简化了我们针对内存管理的开发工作,但是只支持管理 Objective-C 对象, 不支持 Core Foundation 对象。
Core Foundation 对象必须使用CFRetainCFRelease来进行内存管理。

那么当使用Objective-CCore Foundation对象相互转换的时候,必须让编译器知道,到底由谁来负责释放对象,是否交给ARC处理。只有正确的处理,才能避免内存泄漏和double free导致程序崩溃。

根据不同需求,有3种转换方式:

__bridge                   (不改变对象所有权)

__bridge_retained 或者 CFBridgingRetain()               (解除 ARC 所有权)

__bridge_transfer 或者 CFBridgingRelease()             (给予 ARC 所有权
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值