如果我有以下代码:
// 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
之后,share_ptr_with_native()
会再次被ARC保留并保留吗?
除了代码段中的各种错误之外,是的,相关的行是有效的。 ARC继续保持自己对object
的强烈引用,而它仍然在顶级代码中使用,除了你负责的那个。 CFBridgingRetain()
对对象的保留计数具有+1影响,因此在其名称中“保留”。
即使说的一切都是对的,如果你改变你的话也会更好
CFBridgingRelease(PTR);
至
CFRelease(ptr)
。
__bridge_retained或CFBridgingRetain将一个Objective-C指针强制转换为Core Foundation指针,并将所有权转移给您。您有责任调用CFRelease或相关函数来放弃对象的所有权。