美文网首页
内存管理之:__bridge、__bridge_transfer

内存管理之:__bridge、__bridge_transfer

作者: BossMoney | 来源:发表于2022-01-27 10:39 被阅读0次

    当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多得多的功能。

    什么是Toll-Free Bridging/Bridging/免费桥接?

    在Core Foundation框架和Foundation框架中有许多数据类型可以互换使用。可以互换使用的数据类型也称为免费桥接数据类型。这意味着你可以使用相同的数据结构作为Core Foundation函数调用的参数,或者作为Objective-C消息调用的接收者。例如,NSLocale与它的Core Foundation对等物CFLocale是可互换的。

    并非所有数据类型都是免费桥接的,尽管它们的名称可能表明它们是免费的。例如,NSRunLoop不是免费桥接到CFRunLoop, NSBundle不是免费桥接到CFBundle, NSDateFormatter不是免费桥接到CFDateFormatter。

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

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


    image.png image.png

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


    image.png

    _bridge_retain / cfbridgingretain (Foundation→CoreFoundation)

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


    image.png

    相关文章

      网友评论

          本文标题:内存管理之:__bridge、__bridge_transfer

          本文链接:https://www.haomeiwen.com/subject/yxxahrtx.html