1

NSInputStream *との違いはCFReadStreamRef、最初のオブジェクトがObjective Cオブジェクトであり、2番目のオブジェクトがネイティブ構造体であるということです。それにもかかわらず、それらは無料のブリッジです。

ネットワークストリームに基づいたプログラムを実装したい。

  • [NSStream getStreamsToHost:port:inputStream:outputStream:]はとを生成NSInputStream *NSOutputStream *ます。ただし、iOSでは、この方法は使用できません。

    したがって、 iOSではCFStreamCreatePairWithSocketToHostを使用する必要があります。

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(
                     kCFAllocatorDefault, host, port, &readStream, &writeStream);
    NSInputStream *read = (__bridge NSInputStream *)readStream;
    NSOutputStream *write = (__bridge NSOutputStream *)writeStream;
    
  • ストリームプロパティを設定する場合、を使用するとすべてのプロパティを使用できるわけではありませんNSInputStream *。特に、kCFStreamPropertyShouldCloseNativeSocket対応するストリームが閉じられたときにソケットも閉じられるようにすることは興味深いでしょう。

    このプロパティを設定するには、をに変換してNSInputStream *からCFReadStreamRef、変換を元に戻して、このようなプロパティを設定する必要がありますか?

  • ..。

には複数のNSInputStream *欠点があるようです。その場合、私はそれを提供することはできませんが、私がそれの独自のサブクラスを提供できることは本当に唯一の利点CFReadStreamRefですか?どの方法をいつ使用する必要がありますか?

4

1 に答える 1

2

一般に、ほとんどの Foundation/CoreFoundation の無料のブリッジ クラスは、動作の点でも類似しています。しかし、そうです、これはNSInputStream *andには当てはまりませんCFReadStreamRef。AppleのSetting Up Socket Streamsガイドは、あなたが説明したことだけを説明しています。また、最新のイニシャライザ (10.6 で利用可能なものなど) を使用している場合でも、リモートinputStreamWithURL:の場合は機能しません(例: )。urlhttp://...

引き続き使用する主な利点NSInputStreamは、Objective-C アプリケーション内での統合が向上することです。いつでも、次のようにNSInputStream *オブジェクトのプロパティ ( read )を変更することができます。

if (!CFReadStreamSetProperty((CFReadStreamRef)read,
                              kCFStreamPropertyShouldCloseNativeSocket,
                              kCFBooleanTrue))
     failure("property change not accepted");

これらすべてに代わるものとして、URL ローディング システム プログラミング ガイドNSURLRequestで説明されているおよびNSURLConnectionオブジェクトを参照することをお勧めします。

于 2012-08-15T15:41:05.943 に答える