nsmutabledataバイトを削除しますか?
-
23-09-2019 - |
質問
nsmutabledataインスタンスにバイトを簡単に使用することができます appendData
方法ですが、データを削除するための同様の方法はありませんか?私は何かを見落としていますか、それとも新しいオブジェクトを作成し、必要なバイトのみをコピーする必要がありますか?
解決
次の方法のドキュメントをご覧ください。
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Appleは明らかに次のように述べています:
範囲の長さが交換長に等しくない場合、受信機は新しいバイトに対応するようにサイズ変更されます。受信機の過去の範囲はすべて、新しいバイトに対応するためにシフトされます。したがって、交換用バイトにnullを、交換長に0を渡すことができます。また、範囲(長さはゼロの長さである可能性があります)を範囲の長さよりも多くのバイトに置き換えることもできます。これは、挿入の効果があります(または「一部を置き換えて挿入する」)。
最後から10バイトを削除するには、次を使用します。
[data setLength:[data length] - 10];
また、Bytesinrangeを介して実行することもできますが、実際にはバイトが実際に削除されていないため、実際にははるかに速いです。代わりに、内部サイズ変数のみが変更され、nsmutabledataはバイトが削除されたかのように動作します。 IOW、これはO(1)操作です(つまり、削除するバイトの数に関係なく、実行には常に等しく時間がかかることを意味します)、非常に高速です。
正面から10バイトを削除するには、使用してください。
[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];
中央の10バイトを削除するには(たとえば20バイトの後)、使用してください。
[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];
ただし、交換用はO(n)操作です。つまり、100バイトを削除するのにどれだけ時間がかかっても、200バイトなどを削除するのに2倍時間がかかります。それはまだかなり速く、コンピューターのメモリ(RAM)のスループットによってのみ制限されています。 10 MBのデータがあり、正面から1 MBを削除すると、9 MBがコピーされ、除去されたMBのギャップが埋められます。したがって、操作の速度は、システム9 MBのRAMを1つのアドレスから別のアドレスにどれだけ速く移動できるかに依存します。そして、これは通常、数百MBを含むnsmutabledataオブジェクトを扱わない限り、十分に速くなります。
他のヒント
プログラムでコンテンツタイプをライブラリに追加する機能イベント受信機がある必要があります。がある場合は見てください。
削除したいデータが最後にある場合、使用できます
[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];
またはOBJ-C 2.0構文を使用します
NSMutableDataInstance.length -= n;
それよりも複雑なものについては、生データを操作することをお勧めします。
このスレッドには答えがあることがわかりますが、それでもこれは貴重な追加かもしれません。 nsmuttabledataからすべてのバイトを削除するには、新しいデータを作成して元のものにコピーできます。
[myData setData:[NSData dataWithBytes:NULL length:0]];
これはうまく機能します。