如何将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。 这是否意味着释放缓冲区是我的责任?
大部分情况下,你的代码是正确的。 +initWithBytes:length:
将复制缓冲区中发送的缓冲区,您不必担心释放缓冲区后的数据,可以安全地释放数据。
根据文档,你完成后不会释放数据:
如果为buffer_ptr或size_ptr指定非NULL值,那么在这些variables中返回的值仅在释放新创build的分派数据对象之前有效。 您可以使用这些值作为访问新数据对象数据的快捷方式。
你只需释放new_data_file
variables(ARC不会为你做这个)。
由于iOS 7和Mac OS X 10.9( Foundation Release Notes ), dispatch_data_t
是NSObject( NSObject <OS_dispatch_data>
)。 dispatch_data_t
现在可以自由转换为NSData *
,反之亦然。