C ++オブジェクトを客観的なCコレクションに追加するのに苦労(NSSET)
-
27-10-2019 - |
質問
私はQRCODEREADERを使用してZxingを自分のプロジェクトに実装するのに忙しいです。 QRCODEREADERは主にC ++であり、私のプロジェクトObjective-Cです。 QRCODEREADERオブジェクトをObjective-C実装(.mmファイル)に使用できるように、適切に実装することができました。ただし、このC ++オブジェクトをzxwidcontroller.readerプロパティに渡す必要があります。
これは、C ++オブジェクトをNSSETオブジェクトに設定する必要があることを意味します。
QRCodeReader* qrcodeReader = new QRCodeReader();
NSSet *readers = [[NSSet alloc ] init];
[readers setByAddingObject:(id)qrcodeReader];
widController.readers = readers;
[readers release];
上記のコードがトリックを行います。 C ++オブジェクトを(ID)にキャストしましたが、これで適切にコンパイルされました。しかし、これはそれを行うための適切な方法ですか?
この方法は、これを行うための適切な方法ですか?
私の目標を達成するための他の /より良い方法はありますか?
解決
C ++タイプは客観的なCタイプではありません。メッセージ、特に保持およびリリースするメッセージを送信することはできません。使用したいのと同じ名前の客観的なCタイプがあります。 (他の答えを更新します)。
他のヒント
上記のコードがトリックを行います。 C ++オブジェクトを(ID)にキャストしましたが、これで適切にコンパイルされました。しかし、これはそれを行うための適切な方法ですか?
いいえ。 IDにキャストして、有効なObjective-Cオブジェクトポインターに任意のポインターを作成することはできません。
この方法は、これを行うための適切な方法ですか?
繰り返しますが、いいえ。
私の目標を達成するための他の /より良い方法はありますか?
次のいずれかを試すことができます。
ZXWIDCONTROLLERクラスを再定義して、OBJ-Cオブジェクトの代わりにC ++オブジェクトにポインターを使用します。
nsvalueでqrcodereaderをラップします。
NSSETの代替品としてNSPOINTERARRAYをご覧ください。使用する前にドキュメントを必ず読んでください。保存するポインターのタイプに正しいことをするように、メモリ管理ポリシーを構成する必要があります。
マイナーなNitpick:qrcodereaderがC ++オブジェクトを指しているという事実についてしばらく忘れて、オブジェクトを追加できるように空のセットを作成するのはばかげているようです。 OBJ-Cセットを使用する場合は、 +setWithObjectを使用して作成するか、代わりにnsMutablesetを使用します。