6

- とsを併用CFStreamCreatePairWithSocketToHostしたい。私は 2 つの ivarとを持っています。NSInputOutputStreamNSInputStream *_inputStreamNSOutputStream *_outputStream

次の 2 つのエラー メッセージが表示されます。

CFStreamCreatePairWithSocketToHost(NULL,
  (__bridge_retained CFStringRef)self.hostname, self.port,
  (CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream);

エラー: ' CFReadStreamRef *' (別名 ' struct __CFReadStream **') への Objective-C ポインターへの間接ポインターのキャストは、ARC では許可されません
エラー: ' ' (別名 ' ') への Objective-C ポインターへの間接ポインターのキャストは、CFWriteStreamRef *ARCstruct __CFWriteStream **では許可されません

どうすればこれを修正できますか? 使用して__bridgeみましたが、同様のエラーメッセージが表示されました。

4

2 に答える 2

4

実際の変数CFReadStreamRefCFWriteStreamRef変数へのポインターを渡し、NSTypes に割り当てるときにキャストします。基本的:

CFThingRef cfThing = NULL;
CFFunctionGetThing(&cfThing);
NSThing * nsThing = cfThing;

もちろん、適切なブリッジ キャストを追加し、すべての適切な参照カウント操作を実行する必要がありますcfThing

于 2012-01-12T11:40:20.607 に答える
0

ARC が何をしているのか、そして __bridge キャストが何をしているのかを考えてみてください。ARC は NSObject の保持と解放を担当します。__bridge キャストはその責任を移します。たとえば、__bridge_retained は NSString を保持し、ポインターを CFStringRef にキャストし、一致するリリース操作を実行する責任を CFStringRef を使用する人に渡します。

これは、NSObject* へのポインターまたは Core Foundation ref へのポインターでは機能しない可能性があります。ポインタはメモリ位置を指します。あらゆる種類の NSObject* または Core Foundation オブジェクトをそこに格納できます。

NSInputStream* 用と CFReadStreamRef 用の 2 つの変数が必要です。適切なブリッジ キャストを使用して、NSInputStream* を CFReadStreamRef に移動します。これで必要なものが揃い、アドレスを渡すことができます。

于 2014-03-14T21:31:31.410 に答える