簡體   English   中英

ARC和C ++互操作是否正確使用__bridge? (如何避免內存泄漏?)

[英]Correct __bridge usage with ARC and C++ interop? (how to avoid memory leaks?)

我有一些純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 ,但后來我得到EXC_BAD_ACCESS下一次調用ARC retainMYDataStructure ,所以我認為這是過度釋放通過使用__bridge_transfer ,改變它只是__bridge

我是否僅使用__bridge發現任何內存泄漏,或者在這種情況下是否需要使用__bridge_retain__bridge_transfer某種組合?

當您使用__bridge轉換為objc或從objc轉換時,僅影響到船形。 這意味着,在C ++中使用對象時,必須確保周圍仍然有很強的引用。

另一方面,如果您使用__bridge_retain轉換為void *並使用__bridge_transfer轉換回id (或任何其他可保留對象類型),則必須確保每個__bridge_retain都與一個__bridge_transfer完全匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM