这几个关键字都用在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