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

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.csdn.net/sanpintian/article/details/8139878 来简写的,都是个人理解。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值