0

TCPのシンプルなクライアントを作りたいです。しかし、1つのエラーが発生します。作成する inputStream = (NSInputStream *)readStream;outputStream = (NSOutputStream *)writeStream;、プレフィックス__bridgeまたは_bridge_transferを導入するように提案されます

まず、それは何ですか?次に、両方を試しましたが、まだメッセージを送信できません。私はこのチュートリアルに従い、メッセージの送信とストリーミングも行いました。Wiresharkをインストールしましたが、送信メッセージが呼び出されましたが、IPにパケットが送信されていません。

「ブリッジ」エラーが発生する場所であるため、ここにinitNetworkCommunicationを投稿しました。

- (void) initNetworkCommunication {

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"54.xxx.xxx.xxx", 1333, &readStream, &writeStream);

    inputStream = (NSInputStream *)readStream;
    outputStream = (NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

}

サンプルコードを試したところ、応答が返ってきたので、サーバーは正常です。

手伝って頂けますか?

4

1 に答える 1

6

H2CO3が述べたように、それはARCのものです。

ARCとは何かわからない場合は、こちらをお読みください。要約すると、これは、Objective-Cプログラマーが以前は手動で実行しなければならなかったメモリ管理(保持/解放ステートメントなど)を自動化する決定論的な方法です。使用する価値は十分にあり、欠点はほとんどありません。ただし、いくつかの落とし穴があります。

ARCはCoreFoundationオブジェクトでは機能しません。それらはまだ古いルールの対象であり、メモリ管理を自分で行う必要があります。ARCはObjective-Cオブジェクトにのみ適用されます。ただし、一部のCore Foundationオブジェクトは、実際には同等のCocoaに無料でブリッジされています。コードサンプルでフリーダイヤルブリッジを使用して、を作成し、CFReadStreamRefそれをとして使用していNSInputStreamます。

それで、あなたは何をしますか?Appleのドキュメントには次のように書かれています。

Objective-CとCoreFoundationスタイルのオブジェクト間でキャストする場合は、キャスト(objc / runtime.hで定義)またはCore Foundationスタイルのマクロ(で定義)を使用して、オブジェクトの所有権セマンティクスについてコンパイラに通知する必要があります。 NSObject.h):

  • __bridge所有権を譲渡せずに、Objective-CとCoreFoundationの間でポインターを譲渡します。
  • __bridge_retainedまたはCFBridgingRetain、Objective-CポインターをCore Foundationポインターにキャストし、所有権をユーザーに譲渡します。CFReleaseまたは関連する関数を呼び出して、オブジェクトの所有権を放棄する必要があります。
  • __bridge_transferまたはCFBridgingRelease、Objective-C以外のポインタをObjective-Cに移動し、所有権をARCに譲渡します。ARCは、オブジェクトの所有権を放棄する責任があります。

Core FoundationからObjective-Cに移行しているので、2番目の箇条書きは無視してください(これは反対方向に進むためのものです)。問題は、何をしたいのかということです。転送後にそのオブジェクトをARCに渡し、Objective-C側からのみ使用し、ARCにメモリ管理を処理させる場合は、を使用します__bridge_transfer。これは、コードサンプルに基づいておそらく必要なものです。

を使用する場合、またはARCを使用しない場合は、いずれかを使用するか、メッセージを送信して__bridge、オブジェクトを自分でクリアする必要があります(後者は、ARCを使用していない場合にのみ機能します)。CFRelease()release

于 2012-07-13T11:26:43.383 に答える