hfo*_*sli 8 c nsdata dispatch grand-central-dispatch ios
这是正确的方法吗?
// 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 *
Run Code Online (Sandbox Code Playgroud)
它工作正常.我主要担心的是内存泄漏.泄漏数据缓冲区并不好玩.那么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 值,则这些变量中返回的值仅在您释放新创建的调度数据对象之前有效。您可以使用这些值作为访问新数据对象的数据的快速方法。
您只需释放该new_data_file变量即可(ARC 不会为您执行此操作)。
| 归档时间: |
|
| 查看次数: |
7403 次 |
| 最近记录: |