[英]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 retain
在MYDataStructure
,所以我認為這是過度釋放通過使用__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.