0

Objective-C クラスのメソッドへの関数ポインタを使用して、Objective-C データ構造から読み取る純粋な C++ コードが少しあります。不透明なポインターとして読み取る目的の 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 を呼び出しretainたときに EXC_BAD_ACCESS を取得MYDataStructureして__bridge_transferいました__bridge

を使用するだけで探す必要があるメモリリークはありますか、またはこの場合はとを__bridge組み合わせて使用​​する必要がありますか?__bridge_retain__bridge_transfer

4

1 に答える 1

3

objcとの間で変換するために使用__bridgeしている場合、owershipは影響を受けません。つまり、C ++でオブジェクトを使用している間は、強力な参照がまだ存在することを確認する必要があります。

一方、を使用__bridge_retainしてvoid *__bridge_transferに変換し、id(または他の保持可能なオブジェクトタイプ)に変換し直す場合は、それぞれ__bridge_retainが後で正確に一致することを確認する必要があります__bridge_transfer

于 2012-08-30T22:02:55.797 に答える