• 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。

  • 相关阅读:
    【BZOJ】4349: 最小树形图
    【AtCoder】AtCoder Petrozavodsk Contest 001
    【LOJ】#2525. 「HAOI2018」字串覆盖
    趣味题:恺撒Caesar密码(c++实现)
    趣味问题:画图(c++实现)
    趣味问题:到底买不买
    成绩大排队
    A除以B问题
    2017-统计字符个数
    2016-数据的交换输出
  • 原文地址:https://www.cnblogs.com/guoxiaoqian/p/4508544.html
Copyright © 2020-2023  润新知