2012-08-30 51 views
0

我有一些純C++代碼,它是通過指向Objective C類中的方法的函數指針從Objective-C數據結構中讀取的。我將Objective-C類實例視爲不透明指針進行讀取。例如,做閱讀的C++方法具有這樣的特徵:使用ARC和C++ interop糾正__bridge的使用情況? (如何避免內存泄漏?)

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

當我調用C和Objective-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的NEX t時間ARC在MYDataStructure上調用retain,所以我認爲它被使用__bridge_transfer過度釋放,並將其更改爲只有__bridge

是否有任何內存泄漏,我應該只使用__bridge尋找,或者我需要在這種情況下使用__bridge_retain__bridge_transfer的組合?

回答

2

當您使用__bridge轉換爲objc或從objc轉換時,owership不受影響。這意味着,當你在C++中使用對象時,你必須確保仍然有一個強大的參考。

如果,在另一方面,使用__bridge_retain轉換爲void *和__bridge_transfer轉換回id(或任何其他可保留對象類型),則必須確保每個__bridge_retain正好由一個__bridge_transfer後匹配。

+0

所以只要我的對象*沒有被意外釋放,我可以堅持使用__bridge - 謝謝! – yano