• iOS中的自由桥接


    【摘抄自《iOS 6编程实战》】

      与Objective-C库不同,我们在Objective-C中使用标准C语言和Core Foundation类库(CF*方法)不会遵循那些命名约定。这意味着ARC编译器无法百分百地释放不需要的内存。在ARC出现之前,我们可以将CF*对象强制转换成NS*对象,这称为自由桥接(toll-free bridging)。也就是说,我们可以将CFString*通过类型转换变成NSString*类型。而有了ARC,我们便无法再这么做了,至少不指定一个所有权转移修饰符时确实如此。

      ARC允许使用以下这些所有权转移修饰符:__bridge、__bridge_retained、__bridge_transfer

    1、__bridge

      第一个修饰符__bridge是一个普通的转换,它告诉ARC不要增加它的引用计数的值,也不要更改所有权。LLVM的设计师并没有让__bridge成为默认所有权转移修饰符,因为做这样的决定过于大胆了。Core Foundation方法没有一个合适的命名约定,所以在没有明确指定一个所有权转移修饰符的情况下,编译器对于如何转移一个C指针类型的所有权无法错处有把握的决定。

    2、__bridge_retained

      若想要转换C指针类型并增加引用计数的值,我们可以使用第二个修饰符。当要从Objective-C方法(它创建一个Core Foundation对象并在之后使用CFRelease方法将其释放)返回一个保留过的指针时,我们可以使用这个修饰符。如果Objective-C方法属于NSRETURNS_RETAINED系列,就要返回保留过的指针。

    3、__bridge_transfer

      如果要将Core Foundation指针类型转换成Objective-C指针并为引用计数加1,可以使用最后一个修饰符。若Core Foundation方法创建一个对象,并且想要靠ARC来管理对象的内存,我们便可以使用这个修饰符。本质上,我们是“转移”了所有权给ARC。

  • 相关阅读:
    python学习-类属性和实例属性
    python学习-名字管理
    phalcon安装-遇坑php-config is not installed 解决方法
    利用scp 远程上传下载文件/文件夹
    linux tar打包
    ELK logstash 启动慢的解决方法
    shell脚本学习
    ELK日志系统:Filebeat使用及Kibana如何设置登录认证(转)
    elastic5.4安装错误解决
    CentOS 6、7 安装 Golang
  • 原文地址:https://www.cnblogs.com/crazypebble/p/3381260.html
Copyright © 2020-2023  润新知