2012-02-05 29 views
8

これは正しい方法ですか?dispatch_data_tをNSDataに変換するには?

// 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_DESTRUCTOR_FREEと思われます。バッファを解放するのは私の責任ですか?

答えて

3

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

文書によると、あなたがデータを解放しないでください:

あなたがbuffer_ptrまたはsize_ptrのために非NULL値を指定した場合、値はこれらの変数が有効なだけです で返さ新しく作成されたディスパッチデータ オブジェクトをリリースするまでこれらの値は、新しい データオブジェクトのデータに簡単にアクセスするために使用できます。

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

11

iOS 7とMac OS X 10.9(Foundation Release Notesdispatch_data_tはNSObject(NSObject <OS_dispatch_data>)です。 dispatch_data_tNSData *に自由にキャストできるようになりましたが、逆もありません。

+2

これはiOS 7/10.9にのみ該当します。 –

+2

Thx、はい、リリースノートのリンクを追加しました。 – catlan

+0

他の人のための解決策は何ですか? –

関連する問題