2012-02-05 71 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