__bridge,__bridge_transfer和__bridge_retained

__bridge是oc对象和CF对象之间的相互转换,但是不涉及对象所有权的转换
__bridge_transfer是cf对象转为oc对象,将cf对象的所有权转给oc对象,此时ARC自动管理内存,作用同CFBridgingRelease()
__bridge_retained是OC对象转为CF对象,将OC对象的所有权转给CF对象,即OC对象转化成CF对象时,涉及到对象类型和对象所有权的转化,作用同CFBridgingRetain()

0x01 什么是对象间的桥接
Core Foundation 是一组C语言接口,它与Foundation功能相同,只是Foundation框架提供的是Objective-C接口。

Core Foundation中的对象也有类似引用计数的概念,其对应的接口是CFRetain/CFRelease;

这两个框架的对象之间可以相互转换,当使用ARC时,Core Foundation中的对象不被ARC所管理

所以Core Foundation和Foundation中的对象在相互转换的过程中会涉及到对象所有权的转换,这里便用到了bridge修饰符

__bridge关键字修饰的类型转换只把OC对象的指针传递给CF对象,但不传递它的所有权:

NSString *theString = @"Learn Objective-C";
cfString = (__bridge CFStringRef)theString;
 
// cfString gets the assignment, but ownership stays with theString.

当cfString被ARC release后,theString指针仍然指向一个有效的对象。
__bridge_retained
将OC对象转化为CF对象时,所有权归CF对象,相当于 CFBridgingRetain():

NSString *theString = @"Learn Objective-C";
cfString = (__bridge_retained CFStringRef)theString
 
//In this case, cfString string owns the pointer and its retain count is incremented.
//You’re responsible for managing it with retain/release.

使用__bridge_retained进行转换后,cfString便拥有了theString对象的所有权。

这时如果theString被ARC release,cfString仍然有效。

然而又因为Core Foundation中的对象也存在引用计数概念,所以需要使用CFRelease()手动对cfString进行release操作。

__bridge_transfer
这是与__bridge_retained相反的关键字声明。

__bridge_transfer将CF对象转化为OC对象时,所有权归OC对象,相当于CFbridgingRelease():

NSString *theString = @"Learn Objective-C";
cfString = (__bridge_transfer CFStringRef)theString;
 
//In this case, ARC owns the object and will ensure it’s released like any other ARC object.

使用__bridge_transfer进行转换后,ARC会确保theString被释放的同时,cfString也被释放。

你可能感兴趣的:(__bridge,__bridge_transfer和__bridge_retained)