3

かなり大きな NSData (または必要に応じて NSMutableData ) オブジェクトがあり、そこから小さなチャンクを取り出して残りを残したいと考えています。私は大量の NSData バイトを扱っているので、大きなコピーを作成したくはありませんが、代わりに既存のバイトを切り捨てます。基本的:

  • NSData *ソース: < 破棄したい数バイト > + < 保持したい大きなバイト >
  • NSData *destination: <保持したい大量のバイト>

NSMutableData には切り捨てメソッドがありますが、それらは末尾のみを切り捨てますが、私は先頭を切り捨てたいと考えています。私の考えは、メソッドでこれを行うことです:

元の投稿で間違った(コピー)方法を使用したことに注意してください。編集して修正しました

- (const void *)bytes

- initWithBytesNoCopy:length:freeWhenDone:

ただし、これらを使用してメモリを管理する方法を理解しようとしています。プロセスは次のようになると思います(何をすべきかわからない場所に????sを配置しました):

// Get bytes
const unsigned char *bytes = (const unsigned char *)[source bytes];

// Offset the start
bytes += myStart;

// Somehow (m)alloc the memory which will be freed up in the following step
?????

// Release the source, now that I've allocated the bytes
[source release];

// Create a new data, recycling the bytes so they don't have to be copied
NSData destination = [[NSData alloc]
                      initWithBytesNoCopy:bytes
                      length:myLength
                      freeWhenDone:YES];

助けてくれてありがとう!

4

4 に答える 4

5

これは、あなたの望むことですか?

NSData *destination = [NSData dataWithBytes:((char *)source.bytes) + myStart
                                     length:myLength];

「大きなコピーを作成したくない」とあなたが言ったことは知っていますが、これgetBytes:length:はあなたの例で行っていたのと同じコピーしか行わないので、これで問題ないかもしれません.

次のように使用できる もreplaceBytesInRange:withBytes:length:あります。

[source setLength:myStart + myLength];
[source replaceBytesInRange:NSMakeRange(0, myStart)
                  withBytes:NULL
                     length:0];

しかし、ドキュメントはそのメソッドがどのように機能するかを述べておらず (パフォーマンス特性はありません)、sourceNSMutableData である必要があります。

于 2010-06-16T02:17:30.410 に答える
4

コンテキストに応じて、ソリューションは異なる場合があります。NSData指定された範囲で自動解放されたオブジェクトを返すメソッドが必要であると仮定します。

- (NSData *)getSubData:(NSData *)source withRange:(NSRange)range
{
    UInt8 bytes[range.length];
    [source getBytes:&bytes range:range];
    NSData *result = [[NSData alloc] initWithBytes:bytes length:sizeof(bytes)];
    return [result autorelease];
}

もちろん、それをクラスメソッドにして、ある種の「utils」クラスに入れたり、NSData の拡張機能を作成したりできます...

于 2010-08-05T01:03:29.473 に答える
3

メモリ ブロックのコピーを避けたい場合は、 を使用しdataWithBytesNoCopyて古いバッファを特定のオフセットで保持できます。この例では、最初の 2 バイトを「削除」します。

source = [NSData dataWithBytesNoCopy:(char*)source.bytes + 2 length:source.length - 2];

例を簡単にするために、境界チェックはスキップされます。都合のよいように追加してください。iOS 2.0 以降で利用できます。

于 2013-01-29T16:26:15.480 に答える