メソッドを使用してNSMutableDataインスタンスにバイトを簡単に追加できますが、appendData
データを削除するための同様のメソッドが表示されませんか?何かを見落としているのですか、それとも新しいオブジェクトを作成して必要なバイトだけをコピーする必要がありますか?
4 に答える
次の方法のドキュメントを参照してください。
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Appleは明確に次のように述べています。
範囲の長さがreplacementLengthと等しくない場合、レシーバーは新しいバイトに対応するようにサイズ変更されます。レシーバーの範囲を超えたバイトは、新しいバイトに対応するためにシフトされます。したがって、replacementBytesにNULLを渡し、replacementLengthに0を渡して、範囲範囲内のレシーバーのバイトを削除できます。範囲(長さがゼロの場合もあります)を範囲の長さよりも多くのバイトに置き換えることもできます。これにより、挿入の効果があります(または「一部を置き換えてさらに挿入する」)。
末尾から10バイトを削除するには、次を使用します。
[data setLength:[data length] - 10];
replaceBytesInRangeを介して実行することもできますが、バイトが実際に削除されないため、実際にははるかに高速です。代わりに、内部サイズ変数のみが変更され、NSMutableDataはバイトが削除されたかのように動作します。IOW、これはO(1)操作であり(つまり、削除するバイト数に関係なく、実行には常に同じ時間がかかります)、非常に高速です。
フロントから10バイトを削除するには、次を使用します。
[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];
途中(たとえば20バイト後)の10バイトを削除するには、次を使用します。
[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];
ただし、replaceBytesInRangeはO(n)操作です。つまり、100バイトを削除するのにどれだけ時間がかかっても、200バイトを削除するのに2倍の時間がかかります。それでもかなり高速で、コンピュータのメモリ(RAM)のスループットによってのみ制限されます。10 MBのデータがあり、前面から1 MBを削除した場合、削除したばかりのMBのギャップを埋めるために9MBがコピーされます。したがって、操作の速度は、システムが9MBのRAMをあるアドレスから別のアドレスに移動できる速度によって異なります。そして、数百MBを含むNSMutableDataオブジェクトを処理しない限り、これは通常十分に高速です。
NSMutableDataはCFMutableDataRefと無料でブリッジされるため、CFDataDeleteBytes()関数を使用できます。
NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
削除したいデータが最後にある場合は、
[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];
またはobj-c2.0構文を使用
NSMutableDataInstance.length -= n;
それよりも複雑な場合は、生データを操作することをお勧めします。
このスレッドには答えがあるようですが、それでもこれは価値のある追加になる可能性があります。NSMuttableDataからすべてのバイトを削除するには、新しいデータを作成して元のデータにコピーします。
[myData setData:[NSData dataWithBytes:NULL length:0]];
これはうまくいきます。