6

CFStreamCreatePairWithSocketToHostNSInput - およびOutputStreamと使用します。私は二つのイヴァールNSInputStream *_inputStreamNSOutputStream *_outputStreamを持っています。 Objective-Cポインタへの間接ポインタの、 'CFReadStreamRef *'へのキャストはARCで許可されていません

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

error: cast of an indirect pointer to an Objective-C pointer to ' CFReadStreamRef * ' (aka ' struct __CFReadStream ** ') is disallowed with ARC
error: cast of an indirect pointer to an Objective-C pointer to ' CFWriteStreamRef * ' (aka ' struct __CFWriteStream ** ') is disallowed with ARC

がどのように私はこの問題を解決します:

以下は私の2つのエラーメッセージを与えますか?私は__bridgeを使ってみましたが、同様のエラーメッセージが出ます。

答えて

4

実際のCFReadStreamRefCFWriteStreamRefの変数にポインタを渡して、NSTypeに代入するときにキャストします。基本的には:

もちろん
CFThingRef cfThing = NULL; 
CFFunctionGetThing(&cfThing); 
NSThing * nsThing = cfThing; 

、あなたは適切なブリッジキャストを追加し、cfThingのためにすべての適切な参照カウントOPSを行う必要があるでしょう。

+0

これは唯一の方法ですか? –

+0

@WTPわかりません - 私はこれまでARCと多くの時間を費やしていません。包んでください! :) – justin

+0

@WTP:この関数は_inputStreamと_outputStreamの前のコンテンツを独自の新しいCRStreamRefで圧縮するので、CFStreamRefsにすることもできます。 – JeremyP

0

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

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

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

関連する問題