前言
ARC能够解决iOS开发中的绝大部分内存管理问题,但是对于底层CF对象(Core Foundation),由于不在ARC的管辖范围内,所以需要开发人员手动维护这些对象的引用计数。
CF对象的内存管理
底层的CF对象,大多都以XxxCreateWithXxx这样的方式创建,例如:
// 创建一个CTFontRef对象
CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, "Hello World", kCFStringEncodingUTF8);
对于此类CF对象引用计数的修改,要相应的使用CFRetain
和CFRelease
方法
// 引用技术加1
CFRetain(str);
// 引用计数减1
CFRelease(str);
所以在ARC环境下,对于底层的CF对象,我们只需延续以前手动管理引用计数(MRC)的方式即可。
CF对象转换为OC对象
我们有时需要将一个CF对象转换成OC对象,此时我们需要告诉编译器,转换过程中对象的引用技术如何进行调整。为此,引入了bridge
关键字:
__bridge
:只做类型转换,不修改相关对象的引用计数,原来的CF对象在不需要使用时,需要手动调用CFRelease
方法进行释放__bridge_retained
:类型转换后,将对应OC对象引用计数加1,原来的CF对象在不需要使用时,需要手动调用CFRelease
方法进行释放__bridge_transfer
:类型转换后,将CF对象的引用计数交给ARC管理,CF对象在不需要使用时,不需要调用CFRelease
方法