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。

  • 相关阅读:
    HTTP Status 401
    Spring Data Elasticsearch 应用
    Elasticsearch基础概念
    Windows上使用Linux命令
    在服务器搭建git仓库
    SSH
    Linux/Windows 配置config 使用ssh连接
    在阿里云CentOS服务器上安装Python3.7并设置为默认Python
    Linux下Python3源码安装
    Vue
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154093.html
Copyright © 2011-2022 走看看