2012-02-05 74 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_t自由轉換爲NSData *,但反之亦然。

+2

這僅適用於iOS 7/10.9 – 2013-10-29 22:33:10

+2

Thx,是的,我添加了發行說明鏈接。 – catlan 2013-10-29 23:24:45

+0

什麼是他人的解決方案? – 2016-05-18 12:21:54