8

これは正しい方法ですか?

// convert
const void *buffer = NULL;
size_t size = 0;
dispatch_data_t new_data_file = dispatch_data_create_map(data, &buffer, &size);
if(new_data_file){ /* to avoid warning really - since dispatch_data_create_map demands we care about the return arg */}

NSData *nsdata = [[NSData alloc] initWithBytes:buffer length:size];

// use the nsdata... code removed for general purpose

// clean up
[nsdata release];
free(buffer); // warning: passing const void * to parameter of type void *

正常に動作しています。私の主な懸念はメモリリークです。データ バッファのリークは楽しいものではありません。NSData、バッファ、dispatch_data_t new_data_file はすべて正常ですか?

http://opensource.apple.com/source/libdispatch/libdispatch-187.7/dispatch/data.cで読めるものから、バッファは DISPATCH_DATA_DESSTRUCTOR_FREE のようです。つまり、バッファを解放するのは私の責任ですか?

4

2 に答える 2

13

iOS 7 および macOS 10.9 ( Foundation リリース ノート)以降は、 64 ビット アプリdispatch_data_tの NSObject ( ) です。NSObject <OS_dispatch_data>

dispatch_data_tに自由にキャストできるようになりましたがNSData *その逆はできません

于 2013-10-29T22:28:16.357 に答える
3

ほとんどの場合、コードは正しいです。 +initWithBytes:length:送信されたバッファをコピーするので、データの後でバッファを解放することを心配する必要はありません。最初にデータを安全に解放できます。

ドキュメントによると、データを使い終わった後はデータを解放しないでください。

buffer_ptrまたはsize_ptrにNULL以外の値を指定した場合、これらの変数で返される値は、新しく作成されたディスパッチデータオブジェクトを解放するまでのみ有効です。これらの値は、新しいデータオブジェクトのデータにすばやくアクセスする方法として使用できます。

変数を解放するだけnew_data_fileです(ARCはこれを行いません)。

于 2012-02-05T20:57:27.450 に答える