0

我有一些纯 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 时我得到了 EXC_BAD_ACCESS retainMYDataStructure所以我认为它被过度释放了,__bridge_transfer并将其更改为__bridge.

是否有任何内存泄漏我应该通过使用来寻找__bridge,或者在这种情况下我是否需要使用__bridge_retainand的某种组合__bridge_transfer

4

1 回答 1

3

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

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

于 2012-08-30T22:02:55.797 回答