【问题标题】:OS X: How to correctly bridge release pointer with __bridge_transferOS X:如何使用 __bridge_transfer 正确桥接释放指针
【发布时间】:2013-11-13 00:26:06
【问题描述】:

我有一个块对象,它被转换为 void * 指针以传递给 C 库。我正在部署到 OS X 10.6,所以 CFBridgingRetainCFBridgingRelease 不可用。

相反,我正在做:

void ptr_retain(void (^block)()) {
    void *ptr = (__bridge_retained void *)(block);
    ...
    // pass ptr to C lib
}

void ptr_release(const void *ptr) {
    // C lib calls this function
    void (^block)() = (__bridge_transfer void(^)())ptr;
}

问题: 在 ptr_release 我收到“未使用的变量”警告。我担心编译器可能会优化__bridge_transfer 行并且该块永远不会被释放。这会发生吗?即使没有,这是让ARC知道在ptr_release末尾释放块的正确方法吗?

【问题讨论】:

    标签: objective-c automatic-ref-counting objective-c-blocks void-pointers toll-free-bridging


    【解决方案1】:

    当您使用__bridge_retainedCFBridgingRetain() 时,您会得到一个保留计数为+1 的指针。您有责任发布此参考。

    您可以通过将所有权转移回 ARC(使用 __bridge_transferCFBridgingRelease())来释放引用,或者您可以直接调用 CFRelease()

    在你的情况下,只需使用CFRelease():

    void ptr_release(const void *ptr) {
        CFRelease((CFTypeRef)ptr);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多