__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也被释放。
网友评论