大数据

iOS中的Core Foundation, Cocoa Foundation 和内存管理问题

Cocoa Foundation是iOS中的一个重要框架, 我们大量的使用了里面封装好的接口. 但是还有许多我们需要的接口并不包含在Cocoa框架中, 比如RSA算法, MD5算法, SHA1算法, AES加密算法等, Cocoa对象库里并没有相应的实现. 这时候我们可以在Core Foundation框架里面去寻找. 包括NSString类里没有的字符串编码GBK, GB2312, GB18030等, 在Core Foundation里, 都能找到相应的编码. 建立socket连接, 获得输入流和输出流时, 也需要使用Core Foundation里的CFNetwork Api等等.

Cocoa Foundation和Core Foundation的一个重要区别是: Cocoa Foundation是面向对象的, Core Foundation是非面向对象的. 这是造成内存管理方式区别的原因. Cocoa Foundation中的对象使用ARC自动管理内存, 而对于Core Foundation中的对象则需要进行手动管理内存, 使用完之后都需要手动Release.

然后又涉及到另一个问题, 就是Cocoa Foundation和Core Foundation相互转换时内存管理问题. Cocoa Foundation和Core Foundation相互转换时我们使用__bridge, __bridge_transfer, __bridge_retained关键字.

  • 1.__bridge: Cocoa Foundation和Core Foundation对象转化时只涉及对象类型不涉及对象所有权的转化;
  • 2.__bridge_transfer: Cocoa Foundation对象转换成Core Foundation对象时,将Cocoa Foundation对象的所有权交给Core Foundation对象, 此时ARC就能自动管理该内存;
  • 3.__bridge_retained: (与__bridge_transfer相反)常用在将Cocoa Foundation对象转换成Core Foundation对象时, 将Cocoa Foundation对象的所有权交给Core Foundation对象来管理;

当使用_bridge_retained标识符以后, 代表Cocoa Foundation要将对象所有权交给Core Foundation对象自己来管理, 所以我们要在各种Ref使用完成以后用Release将其手动释放.