关于iOS中 __bridge,__bridge_transfer和__bridge_retained的使用

本文介绍了CoreFoundation框架,它是一组C语言接口,为iOS应用程序提供基本数据管理和服务功能,包括群体数据类型管理、字符串管理、日期和时间管理等。文章还讲解了如何在ARC环境下使用该框架,并提供了CFStringRef与NSString之间的转换示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Core Foundation 框架 和 Foundation 框架是紧密相关的。

Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。

下面列举该框架支持进行管理的数据以及可提供的服务:

群体数据类型 (数组、集合等)、程序包、字符串管理、日期和时间管理、原始数据块管理、

偏好管理、URL及数据流操作、线程和RunLoop、端口和soket通讯


现在基本都是ARC机制,只简要说下在ARC下使用

比如说我们代码里面常见的

CFDictionaryRef、CFArrayRef、CFStringRef 和NSDictionary、NSArray、NSString 互相转换


//string 会自动释放  cfString 不会自动释放    在转换的时候要用__bridge_retained 

NSString *string = [NSString stringWithFormat:...];

//保留
CFStringRef cfString = (__bridge_retained CFStringRef)string;
...

//释放
CFRelease(cfString); // 由于Core Foundation的对象不属于ARC的管理范畴,所以需要自己release


//cfString 转移成NSString    NSSting ARC自动释放   

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



为了解决这一问题,我们使用 __bridge 关键字来实现id类型与void*类型的相互转换。看下面的例子。

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


 CFBridgingRetain( ) 代替 __bridge_retained 

 CFBridgingRelease() 代替 __bridge_transfer 


本文参考:http://blog.youkuaiyun.com/sanpintian/article/details/8139878 来简写的,都是个人理解。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值