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

问题描述 投票:0回答:2

如果我有以下代码:

// 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保留并保留吗?

automatic-ref-counting objective-c++ toll-free-bridging
2个回答
2
投票

除了代码段中的各种错误之外,是的,相关的行是有效的。 ARC继续保持自己对object的强烈引用,而它仍然在顶级代码中使用,除了你负责的那个。 CFBridgingRetain()对对象的保留计数具有+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

© www.soinside.com 2019 - 2024. All rights reserved.