如果我有以下代码:
// 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()
会再次有效并保留吗?
答案 0 :(得分:2)
除了代码段中的各种错误之外,是的,有问题的行是有效的。 ARC继续保留自己对object
的强烈引用,除了您负责的代码之外,它仍然在顶级代码中使用。 CFBridgingRetain()
对对象的保留计数具有+1影响,因此&#34;保留&#34;以它的名字。
答案 1 :(得分:2)
即使说的都是对的,如果你改变你的
会更好CFBridgingRelease(PTR);
到
CFRelease(ptr)
。
__ bridge_retained或CFBridgingRetain将一个Objective-C指针强制转换为Core Foundation指针,并将所有权转移给您。 您有责任调用CFRelease或相关函数来放弃对象的所有权。