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

 

简单说就是用来做CF对象与OC对象类型转换用的,__bridge_retained为了防止OC对象转成CF对象后原OC对象被释放造成野指针__bridge_transfer为了防止CF对象转成OC对象后原CF对象没有释放造成内存泄露

 

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

 

id str = CFBridgingRelease(pStr);  //id赋值时ARC下会自己引用计数加1,所以后面转换的时候要用Release。

CFStringRef pStr = CFBridgingRetain(str);//CFStringRef赋值时ARC下不会自己引用计数加1,所以后面转换的时候要用Retain。

 

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

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

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

posted on 2020-08-30 12:34  ximenchuixie  阅读(229)  评论(0编辑  收藏  举报