个性化阅读
专注于IT技术分析

内存管理之:__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。

可在CoreFoundation和Foundation之间交换使用的数据类型列表

Core Foundation和Foundation免费桥接API

Core Foundation API中的函数命名约定(create/copy规则)

如果一个Core Foundation函数包含单词“Create”或“Copy”,那么你就拥有该对象。也就是说,你是该对象的所有者。一旦你完成了那个对象,你就有责任去释放它。ARC将无法处理Core Foundation对象。

使用Core Foundation API例子
Core Foundation API使用例子2

__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释放

CoreFoundation→Foundation

_bridge_retain / cfbridgingretain (Foundation→CoreFoundation)

使用_bridge_retain或cfbridgingretain通过所有权转移将指针从Foundation转移到CoreFoundation。在这种情况下,你有责任释放转换后的对象

Foundation→CoreFoundation
赞(0)
未经允许不得转载:srcmini » 内存管理之:__bridge、__bridge_transfer、__bridge_retained

评论 抢沙发

评论前必须登录!