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_DESTRUCTOR_FREE。这是否意味着释放缓冲区是我的责任?

4

2 回答 2

13

由于 iOS 7 和 macOS 10.9(Foundation Release Notesdispatch_data_t是 64 位应用程序中的 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 回答