3

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

相反,我正在做:

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吗?

4

1 回答 1

3

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

您可以通过将所有权转移回 ARC(使用__bridge_transferor CFBridgingRelease())来释放引用,或者您可以简单地调用CFRelease().

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

void ptr_release(const void *ptr) {
    CFRelease((CFTypeRef)ptr);
}
于 2013-11-04T16:31:28.963 回答