iOS开发|ARC下CF对象的内存管理

Posted by Jack on May 11, 2014

前言

ARC能够解决iOS开发中的绝大部分内存管理问题,但是对于底层CF对象(Core Foundation),由于不在ARC的管辖范围内,所以需要开发人员手动维护这些对象的引用计数。

CF对象的内存管理

底层的CF对象,大多都以XxxCreateWithXxx这样的方式创建,例如:

// 创建一个CTFontRef对象
CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault, "Hello World", kCFStringEncodingUTF8);

对于此类CF对象引用计数的修改,要相应的使用CFRetainCFRelease方法

// 引用技术加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方法