CFBridgingRelease是否在没有直接赋值的情况下将所有权恢复到预先存在的引用?

时间:2018-03-02 03:08:47

标签: automatic-ref-counting objective-c++ toll-free-bridging

如果我有以下代码:

// objective C++ code .mm
id<MTLTexture> texture = ...;
void* ptr = (void*)CFBridgingRetain(texture);
share_ptr_with_native_code(ptr);
[texture do_stuff]; // is this valid?

// native code .cpp
void share_ptr_with_native(void* ptr)
{
  ptr->do_stuff();
  CFBridgingRelease(ptr);
}

调用texture后,ARC share_ptr_with_native()会再次有效并保留吗?

2 个答案:

答案 0 :(得分:2)

除了代码段中的各种错误之外,是的,有问题的行是有效的。 ARC继续保留自己对object的强烈引用,除了您负责的代码之外,它仍然在顶级代码中使用。 CFBridgingRetain()对对象的保留计数具有+1影响,因此&#34;保留&#34;以它的名字。

答案 1 :(得分:2)

即使说的都是对的,如果你改变你的

会更好
  

CFBridgingRelease(PTR);

CFRelease(ptr)

  

__ bridge_retained或CFBridgingRetain将一个Objective-C指针强制转换为Core Foundation指针,并将所有权转移给您。   您有责任调用CFRelease或相关函数来放弃对象的所有权。

取自https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html