まず、NSNumber * numeroは「NSNumber型へのポインタ」であり、NSNumber型はObjective-Cオブジェクトです。一般に、ドキュメンテーションのどこかに具体的に記載されていない限り、オブジェクト指向プログラミングの経験則は、「オブジェクトがその内部状態を表現する方法の内部的な詳細は、オブジェクト実装にとってはプライベートであり、ボックス。"もう一度、ドキュメンテーションがあなたがそうでないと言わない限り、NSNumberが与えたint
の値を格納するために、Cプリミティブ型のint
を使用していると仮定することはできません。
次のときappendBytes:numero
「舞台裏」で何が起こっているかの大まかな近似である:これは何をNSMutableData
オブジェクトdata
に追加していることであること、それはもう少し明確にし
typedef struct {
Class isa;
double dbl;
long long ll;
} NSNumber;
NSNumber *numero = malloc(sizeof(NSNumber));
memset(numero, 0, sizeof(NSNumber));
numero->isa = objc_getClass("NSNumber");
void *bytes = malloc(1024);
memcpy(bytes, numero, sizeof(numero)); // sizeof(numero) == sizeof(void *)
numero
の最初の4バイト(Obj-Cのオブジェクトは常にisa
、オブジェクトクラス)を指しています。あなたが "したい"と思うのは、ポインターをインスタンス化オブジェクト(numeroの値)にコピーすることです。その場合は、&numero
を使用してください。これは、NSMutableData
が使用しているバッファーとしてGCを使用している場合に問題になります(つまり、GCシステムはオブジェクトを「参照」しなくなり、それを再利用することはなくなります。後でランダムなクラッシュを保証します)ポイント。)
インスタンス化されたNSNumber
オブジェクトへのポインタをdata
に入れても、そのポインタはそれを作成したプロセスのコンテキストでのみ意味があることは間違いありません。そのオブジェクトへのポインタは、そのポインタを別のコンピュータに送信すると意味がありません。受信側のコンピュータには、送信側のコンピュータでポインターが指しているメモリを読み取る方法はありません(実際的ではありません)。
あなたは、プロセスのこの部分で問題を抱えているように見えるので、私はあなたがに実行するためにバインドされているいくつかの非常に困難な実装のバグをデバッグするの数え切れないほどの時間を節約する勧告を作ってみよう:
放棄マシン間で未処理のバイナリデータを送信し、単純なASCII/UTF-8形式の情報をそれらの間で送信しようとする考え方全体です。
これは、どのように遅くなるか非効率になると思うなら、最初に単純化されたASCII/UTF-8文字列化バージョンを使用してすべてのものを持ち出すことをお勧めします。あなたが不可避的な問題をデバッグしているときに生のバイナリデータをデバッグするのは楽しいことではなく、ちょうどNSLog(@"I got: %@", dataString)
の能力は金の価値があります。それから、すべてが一旦ゲル化し、交換する必要があるものをそれ以上変更する必要がないと確信しているならば、バイナリのみのバージョンへの実装(より良い言葉の欠如のために)もしであり、である場合にのみ、Shark.appでプロファイリングすると問題領域として識別されます。参照のポイントとして、最近では、マシン間でファイルをscp
して、転送とギガビットリンクを飽和させることができます。 scp
は、おそらく、この単純な文字列化よりもデータを圧縮して暗号化するために、1バイトあたり約5千倍の処理を行う必要があり、80MB /秒を転送します。しかし、現代的なハードウェアでは、これは私のメニューバーで動いているCPUメーターを少しでも動かすだけです。
私はまだエラーを取得しています: –
「警告: 『:長さappendBytes』の渡し引数1は、キャストなしで整数からポインタを作る」その最後の行は次のようになります。 [データappendBytes:&networkIntegerのsizeof(networkInteger)] ; "&"に注意してください。 –
それはそれをした...ありがとう。ちなみに、appleofのドキュメントでsizeof()の前に "length:"を置くと言っています。それはメソッド名の一部です。ドキュメントの完全な例は、このようなものです。 - (void)appendBytes:(const void *)バイトの長さ:(NSUInteger)length 私は何も言いたくはありませんでしたが、2人がこれを見なかったとき、私はそれを言及すべきだと思った。 –