gpt4 book ai didi

c++ - 更正 __bridge 与 ARC 和 C++ 互操作的用法? (如何避免内存泄漏?)

转载 作者:行者123 更新时间:2023-11-28 00:54:35 39 4
gpt4 key购买 nike

我有一些纯 C++ 代码,它在指向 Objective C 类中方法的函数指针的帮助下从 Objective-C 数据结构中读取。我将要读取的 Objective-C 类实例视为不透明指针。例如,执行读取的 C++ 方法具有如下签名:

typedef void(*DataGetterFunc)(void * dataSource, int key, int * outValue);
...
void readData(void * dataSource, DataGetterFunc dataReadingFunc);

当我从 Objective-C 调用 C++ 方法时,我执行以下操作:

MYDataStructure * objectiveCData;
cppObject->readData((__bridge void*)objectiveCData, DataGetterFuncImpl);

最后,DataGetterFuncImpl像这样取消引用 Objective-C 类:

void DataGetterFuncImpl(void * dataSource, int key, int * outValue)
{
MYDataStructure * objCData = (__bridge MYDataStructure*)dataSource;
...
}

最初在 DataGetterFuncImpl我用的是 __bridge_transfer ,但是下次 ARC 调用 retain 时我得到了 EXC_BAD_ACCESS在 MYDataStructure , 所以我假设它是通过使用 __bridge_transfer 过度发布的并将其更改为 __bridge .

我是否应该仅使用 __bridge 来查找任何内存泄漏? ,还是我需要使用 __bridge_retain 的某种组合?和 __bridge_transfer在这种情况下?

最佳答案

当您使用 __bridge 与 objc 相互转换时,所有权不受影响。这意味着,当您在 C++ 中使用该对象时,您必须确保周围仍然存在强引用。

另一方面,如果您使用 __bridge_retain 转换为 void* 并使用 __bridge_transfer 转换回 id(或任何其他可保留对象类型),您必须确保每个 __bridge_retain 都与一个 __bridge_transfer 稍后匹配。

关于c++ - 更正 __bridge 与 ARC 和 C++ 互操作的用法? (如何避免内存泄漏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205937/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com