__bridge,__bridge_retained与__bridge_transfer用法及区别整理

桥接一般用于Objective-C的对象与Core Foundation中的类对象之间的转换。它实际上是内存储管理权的移交。因为Objective-C是ARC管理的对象,而Core Foundation不是ARC管理的对象,所以才要特意这样转换。也就是说,当这两种类型(有ARC管理,没有ARC管理)在转换时,需要告诉编译器怎样处理对象的所有权。


(1)__bridge:只做类型转换,但是不修改对象(内存)管理权

eg:

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

CFStringRef cfString = (__bridge CFStringRef)string;


说明:__bridge只是单纯地执行了类型转换,没有进行所有权的转移,也就是说,当string对象被释放的时候,cfString也不能被使用了。


(2)__bridge_retained /CFBridgingRetain:将Objective-C的对象——>Core Foundation的对象,同时将对象(内存)的管理权交给开发者,后续需要使用CFRelease或者相关方法来释放对象

eg:

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

CFStringRef cfString = (__bridge_retained CFStringRef)string;

...

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


说明:__bridge_retained 可以通过转换目标处(cfString)的 retain 处理,来使所有权转移。即使 string 变量被释放,cfString 还是可以使用具体的对象。只是有一点,由于Core Foundation的对象不属于ARC的管理范畴,所以需要自己release。可以用 CFBridgingRetain 替代 __bridge_retained 关键字:


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

CFStringRef cfString = CFBridgingRetain(string);

...

CFRelease(cfString); // 由于Core Foundation不在ARC管理范围内,所以需要主动release


(3)__bridge_transfer/CFBridgingRelease:将Core Foundation的对象——>Objective-C的对象,同时将CF对象(内存)的管理权交给ARC,不需要手动release

eg:

CFStringRef cfString = CFStringCreate...();

NSString *string = (__bridge_transfer NSString *)cfString;

// CFRelease(cfString); 因为已经用 __bridge_transfer 转移了对象的所有权,所以不需要调用 release

同样,我们可以使用 CFBridgingRelease() 来代替 __bridge_transfer 关键字:

CFStringRef cfString = CFStringCreate...();

NSString *string = CFBridgingRelease(cfString);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值