首页 > 其他 > 详细

__bridge, __bridge_retained, __bridge_transfer区别

时间:2020-08-30 13:58:43      阅读:64      评论:0      收藏:0      [点我收藏+]

这几个关键字都用在Core Foundation对象与Foundation对象的转换中

 

简单说就是用来做CF对象与OC对象类型转换用的,__bridge_retained为了防止OC对象转成CF对象后出现野指针__bridge_transfer为了防止CF对象转成OC对象后出现内存泄露

 

Core Foundation:C语言实现的一个框架。

Foundation:OC实现的一个框架。

 

Core Foundation对象是用Core Foundation框架生成的用引用计数管理的对象

Foundation对象就是用Foundation框架生成的对象。(通常所说的OC对象)。

 

Core Foundation框架是用C语言写的框架,Foundation框架使用OC写的框架,但是这两个框架生成的引用计数管理的对象是相同的,即生成对象可以在两个框架中使用。Foundation框架生成的对象可以用Core Foundation的API释放,同样Core Foundation生成的对象也可以用Foundation的API释放

 

__bridge, __bridge_retained, __bridge_transfer的作用都是转换Core Foundation对象和Foundation对象。由于这种转换不需要消耗额外的CPU资源,因此又叫toll-free bridge(免费桥接)。

__bridge_retained和__bridge_transfer都是在ARC下才能使用,相当于告诉编译器这个地方需要引用计数加一还是减一。因为MRC下都是手动管理内存,不需要编译器的参与,所以无所谓。

 

OC对象转CF对象,用  __bridge_retained(CFBridgingRetain),引用计数加1,因为不用的话ARC下OC对象释放后有可能会造成指向CF对象的指针变成野指针。

CF对象转OC对象,用__bridge_transfer(CFBridgingRelease),引用计数减1,因为不减1的话会造成内存泄漏

当然理论上以上两种情况都可以通过直接__bridge转换然后另外单写CFRetain()或CFRelease()来解决

 

记忆方法:

OC对象转CF对象后引用计数需要加1,所以用CFBridgingRetain()

CF对象转OC对象后引用计数需要减1,所以用CFBridgingRelease()

(Retain OC,Release CF

 

__bridge:直接互相转换Core Foundation对象与Foundation对象.

__bridge_retained:将Foundation对象(OC对象)转为Core Foundation对象对象转换后引用计数加1,对应一个函数CFBridgingRetain()

__bridge_transfer(transfer可以理解为所有权转换):将Core Foundation对象转换为OC对象对象转换后引用计数加1,原始对象的引用计数减1,如果没有对应的赋值对象,那么直接原始对象的引用计数减1,对应一个函数CFBridgingRelease()

__bridge, __bridge_retained, __bridge_transfer区别

原文:https://www.cnblogs.com/yibinpan/p/13584941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!