0

私は現在、ゲームのネットワークレイヤーを実装している最中ですが、進歩を遂げていますが、誰かが何かを流してくれることを望んでいた非常に奇妙なことに遭遇しました。

データを送信する前に、データをタイプNSData(message.cards = [MovePlayer beginEncodeMyCards:myCards];)にエンコードしてから、ポインター(message.cards)に割り当てます。

MessageMove message;
message.message.messageType = kMessageTypeMove;
/**/message.cards = [MovePlayer beginEncodeMyCards:myCards];/**/
NSData *data = [NSData dataWithBytes:&message length:sizeof(message)];

次のようにクライアント側ですべてのデコードを行う場合:

MessageMove *myMessage  = (MessageMove *) [data bytes];
/**/myCards = [MovePlayer beginDecodeMyCards:myMessage->cards cardArray:myCards];/**/

すべてが正常に機能し、myMessage->カードをデコードできますが、オブジェクトをリモートで送信した後に同じことを実行しようとすると、正しいメッセージタイプ(kMessageTypeMove)は表示されますが、カードデータ(myMessage->カード)は表示されません。

誰かがこれにいくつかの光を当てることができれば私はそれを大いに感謝します

どうもありがとう

4

1 に答える 1

0

tl; dr、NSCodingを使用してオブジェクトをシリアル化します。

反対側のポインターはすべて間違っているため、別のプロセスにポインターを送信することはできません。

送信機で、あなたはこれを持っているとしましょう:

NSLog(@"cards: %p", message.cards);
//prints "cards: 0xDEADBEEF"

これは、NSArray*オブジェクトのメモリのチャンクがメモリアドレス0xDEADBEEFで始まることを示しています。これはこの時点ですべて正しいです。

ここで、その0xDEADBEEFポインターを別のコンピューターに送信します。コンピュータはポインタを取得しますが、のメモリに0xDEADBEEFは他のコンピュータのNSArrayがありません。その記憶の領域には何でもあり得ます。ポインタを送信しましたが、実際にはポインタを使用してデータを送信していません。

簡単に言えば、NSCoder非常に優れているため、シリアル化に使用するだけです。

于 2012-05-03T01:44:24.723 に答える