zoukankan      html  css  js  c++  java
  • (九十九)桥接的介绍

    OC中的桥接用于在C结构体(例如CFStringRef)和OC对象(例如NSString)之间进行转换。

    在非ARC环境下,如果要实现转换,直接进行强制类型转换:

     // NSString转C String
     NSString *ocStr = [NSString stringWithFormat:@"OC字符串"];
     CFStringRef cfStr = (CFStringRef)ocStr;
    
     // 直接创建C String
     CFStringRef cfStr1 = CFStringCreateWithCString(CFAllocatorGetDefault(), "C String", kCFStringEncodingASCII);
     
     // C String转NSString
     NSString *ocStr1 = (NSString *)cfStr1;
    

    在ARC环境下,不能这样转换,要借助桥接:

     NSString *ocStr = [NSString stringWithFormat:@"OC字符串"];
     CFStringRef cfStr = (__bridge CFStringRef)ocStr;
    
     NSString *ocStr1 = (__bridge NSString *)cfStr1;
    

    桥接有三种方式:其中type是类型名,而expression一半不用填写。
    (__bridge <#type#>)<#expression#>) 仅仅将值的地址进行转换,并没有转移对象的所有权,如果被桥接的对象释放,则桥接后的值也无法使用。在ARC下使用__bridge,因为所有权仍然属于OC,因此归ARC管制,不必手动释放。
    (__bridge_retained <#CF type#>)<#expression#>) 将对象的所有权转移给桥接后的对象。
    在ARC下使用__bridge_retained,此时ARC不能管理C语言内存,因此应该手动释放,应该使用CFRelease释放。等同于CFBridgingRetain(<#id X#>)
    (__bridge_transfer <#Objective-C type#>)<#expression#>) 会转移所有权,并且会自动释放内存。等同于CFBridgingRelease(<#CFTypeRef X#>)

    因此一般使用__bridge或者__bridge_transfer。

  • 相关阅读:
    在Unix上使用管道压缩exp导出文件
    自制CPU的黑暗历程一
    Error C1189: #error: Please use the /MD switch for _AFXDLL builds
    Redis乐观锁解决高并发抢红包的问题
    PHP分页类
    汇编基础——使用nasm和bochs学习汇编
    数据同步工具DBsync
    完成端口的一些教程
    sdf
    (转)C#(WIN FORM)两个窗体间LISTVIEW值的修改
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154093.html
Copyright © 2011-2022 走看看