0

メモリ内に巨大な NSMutableData オブジェクト (サイズが約 1 MB) があり、オブジェクト内のすべてのバイトを 0 に置き換えたい (メモリの割り当てを解除しない) 必要があります。resetBytesInRange メソッドを使用すると、これを実行できます。ただし、バイトが実際に0に設定されているかどうかを確認/確認するにはどうすればよいですか。メモリアドレスを見て、これを確認したいと思います。これは可能ですか?

次のコードがあります

NSMutableData *imgData = [NSMutableData dataWithCapacity:50000000];
imgData = (NSMutableData*)UIImageJPEGRepresentation(img, 1.0);
[imgData resetBytesInRange:NSMakeRange(0, [imgData length]) ];

ここで、imgData が指すアドレス (および次のいくつかの場所) を調べると、resetBytes の前後で、imgData が指すアドレスから始まるメモリ位置の値に変化は見られません (私は割り当てられたゼロを参照してください)。メモリ割り当ては、imgData が指すアドレスから開始して ([imgData の長さ] まで) 連続していると仮定しました。この仮定は正しいですか(そうではないようです)?そうでない場合、NSMutableData オブジェクトのバイトはどこに保存されていますか? 個別にアクセスできますか?

ありがとう

ヴィベク

4

2 に答える 2

0

問題は、それが機能しないことで-resetBytesInRange:はありません。問題は、そのメッセージを間違ったオブジェクトに送信していることです。

imgData = (NSMutableData*)UIImageJPEGRepresentation(img, 1.0);最初の行で作成した可変データに JPEG バイトを割り当てません。そのオブジェクトへの参照を新しいオブジェクトへの参照に置き換え、キャストを使用して、無効なストアに関するコンパイラの警告を抑制します。これを適切に行うには、いくつかの方法があります。

NSMutableData *imgData = [NSMutableData data]; /* note, we do not specify a capacity--it's pointless for this use case */
[imgData setData: UIImageJPEGRepresentation(img, 1.0)];
[imgData resetBytesInRange: NSMakeRange(0, [imgData length])];

または:

NSMutableData *imgData = [[UIImageJPEGRepresentation(img, 1.0) mutableCopy] autorelease];
[imgData resetBytesInRange: NSMakeRange(0, [imgData length])];

しかし、どちらも明らかなことを無視しています。データをすぐにゼロにクリアしているのに、なぜわざわざ JPEG データを作成する必要があるのでしょうか。ここで実際に何をしようとしていますか?

于 2012-06-28T14:31:27.977 に答える
0

imgDataポインターです (*記号で示されます)。したがって、それはメモリの場所を指し、割り当てはそれが指す場所を変更するだけです。実際のメモリ位置をバイト単位で操作できるようにすることは、ほとんどのプログラミング言語の意図ではありません。

これを読んでください:http://www.cplusplus.com/forum/general/3644/

于 2012-06-28T14:04:32.733 に答える