【问题标题】:Correct __bridge usage with ARC and C++ interop? (how to avoid memory leaks?)正确使用 ARC 和 C++ 互操作的 __bridge? (如何避免内存泄漏?)
【发布时间】:2012-08-30 21:39:04
【问题描述】:

我有一些纯 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 下次在MYDataStructure 上调用retain 时,我得到了EXC_BAD_ACCESS,所以我认为它是通过使用__bridge_transfer 过度释放的并将其更改为 __bridge

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

【问题讨论】:

    标签: c++ objective-c automatic-ref-counting


    【解决方案1】:

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

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

    【讨论】:

    • 所以只要我的对象没有被意外释放,我可以坚持使用 __bridge -- 谢谢!
    猜你喜欢
    • 2013-01-23
    • 2020-06-24
    • 2012-02-12
    • 1970-01-01
    • 2013-09-23
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多