iOS开发中的ARC内存管理机制(3)——OC对象和CF对象之间的桥接(Bridge)

0x01 什么是对象间的桥接

Core Foundation 是一组C语言接口,它与Foundation功能相同,只是Foundation框架提供的是Objective-C接口。

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

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

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

0x02 桥接关键字

__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也被释放。

0x04 ARC对象桥接功能总结

每一个 CFRetain 都需要一个 CFRelease 对应;

每一个 CFCreate 都需要一个 CFRelease 对应;

__bridge_retained 等价于 CFRetain;

__bridge_transfer 等价于 CFRelease;

猜你喜欢

转载自blog.csdn.net/qq_33737036/article/details/81288539