zoukankan      html  css  js  c++  java
  • IOS的__bridge

    使用 __bridge 关键字来实现id类型与void*类型的相互转换。看下面的例子。

    id obj = [[NSObject alloc] init];
     
    void *p = (__bridge void *)obj;
     
    id o = (__bridge id)p;

    __bridge_retained
    先来看使用 __bridge_retained 关键字的例子程序:

    id obj = [[NSObject alloc] init];
     
    void *p = (__bridge_retained void *)obj;
    从名字上我们应该能理解其意义:类型被转换时,其对象的所有权也将被变换后变量所持有。如果不是ARC代码,类似下面的实现:

    id obj = [[NSObject alloc] init];
     
    void *p = obj;
    [(id)p retain];

    __bridge_transfer
    相反,当想把本来拥有对象所有权的变量,在类型转换后,让其释放原先所有权的时候,需要使用 __bridge_transfer 关键字。文字有点绕口,我们还是来看一段代码吧。

    如果ARC无效的时候,我们可能需要写下面的代码。

    // p 变量原先持有对象的所有权
    id obj = (id)p;
    [obj retain];
    [(id)p release];
    那么ARC有效后,我们可以用下面的代码来替换:

    // p 变量原先持有对象的所有权
    id obj = (__bridge_transfer id)p;
    可以看出来,__bridge_retained 是编译器替我们做了 retain 操作,而 __bridge_transfer 是替我们做了 release1。

  • 相关阅读:
    Linux命令详解之—tail命令
    Linux命令详解之—less命令
    Linux命令详解之—more命令
    Linux命令详解之—cat命令
    Linux命令详解之—pwd命令
    Linux命令详解之–cd命令
    ubuntu-14.04安装最新tensorflow记录
    rn最新版测试
    boost asio死锁一例
    dskinlite自适应dpi
  • 原文地址:https://www.cnblogs.com/guoxiaoqian/p/4508544.html
Copyright © 2011-2022 走看看