内存管理之(__bridge、__bridge_transfer、__bridge_retained)

当Cocoa/CocoaTouch框架处理几乎所有具有高级API的东西时,使用Core Foundation中的东西则可能有一些困惑,本文主要介绍Core Foundation和Foundation的区别以及相关的内存管理。
什么是Core Foundation API和Foundation API?Core Foundation API是用c编写的,而Foundation API是用Objective-C编写的。Foundation API以更抽象的方式提供了比Core Foundation多得多的功能。
苹果在1996年收购了NeXT。然后OSX从Mac OS 9和OpenStep by NeXT演变而来。OpenStep是在Objective-C中开发的,并演化为Cocoa框架。Foundation API是这个Cocoa框架的一部分。
什么是Toll-Free Bridging/Bridging/免费桥接?在Core Foundation框架和Foundation框架中有许多数据类型可以互换使用。可以互换使用的数据类型也称为免费桥接数据类型。这意味着你可以使用相同的数据结构作为Core Foundation函数调用的参数,或者作为Objective-C消息调用的接收者。例如,NSLocale与它的Core Foundation对等物CFLocale是可互换的。
并非所有数据类型都是免费桥接的,尽管它们的名称可能表明它们是免费的。例如,NSRunLoop不是免费桥接到CFRunLoop, NSBundle不是免费桥接到CFBundle, NSDateFormatter不是免费桥接到CFDateFormatter。
【内存管理之(__bridge、__bridge_transfer、__bridge_retained)】可在CoreFoundation和Foundation之间交换使用的数据类型列表

内存管理之(__bridge、__bridge_transfer、__bridge_retained)

文章图片
Core Foundation API中的函数命名约定(create/copy规则)如果一个Core Foundation函数包含单词“Create”或“Copy”,那么你就拥有该对象。也就是说,你是该对象的所有者。一旦你完成了那个对象,你就有责任去释放它。ARC将无法处理Core Foundation对象。
内存管理之(__bridge、__bridge_transfer、__bridge_retained)

文章图片
内存管理之(__bridge、__bridge_transfer、__bridge_retained)

文章图片
__bridge(CoreFoundation ← → Foundation)用于在Core Foundation和Foundation之间转移/转换指针。在没有所有权转移的情况下,在Objective-C和Core Foundation之间转移指针
-(void)greetViaBridge { CFStringRef stringRef = CFStringCreateWithCString(NULL, "Hello World via bridge", kCFStringEncodingUTF8); NSString *text = (__bridge NSString *) stringRef; NSLog(@"%@", text); CFRelease(stringRef); }

_bridge_transfer / CFBridgingRelease (CoreFoundation→Foundation)使用_bridge_transfer或CFBridgingRelease通过所有权转移将指针从Core Foundation转移到Foundation。在这种情况下,不需要显式地释放CF对象。被转换的对象将被ARC释放
内存管理之(__bridge、__bridge_transfer、__bridge_retained)

文章图片
_bridge_retain / cfbridgingretain (Foundation→CoreFoundation)使用_bridge_retain或cfbridgingretain通过所有权转移将指针从Foundation转移到CoreFoundation。在这种情况下,你有责任释放转换后的对象
内存管理之(__bridge、__bridge_transfer、__bridge_retained)

文章图片

    推荐阅读