2012-02-05 20 views
8

¿Es esta la manera correcta?Cómo convertir dispatch_data_t a 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 * 

Está funcionando bien. Mi principal preocupación es la pérdida de memoria. Los buffers de datos que se escapan no son divertidos. Entonces, ¿están bien el NSData, el buffer y el dispatch_data_t new_data_file?

Por lo que puedo leer en http://opensource.apple.com/source/libdispatch/libdispatch-187.7/dispatch/data.c parece que el búfer es DISPATCH_DATA_DESTRUCTOR_FREE. ¿Eso significa que es mi responsabilidad liberar el buffer?

Respuesta

3

En su mayor parte, su código es correcto. +initWithBytes:length: copiará el búfer enviado así que no tiene que preocuparse de liberar el búfer después de los datos, primero puede liberar los datos de forma segura.

Según la documentación, no es liberar a los datos después de que haya terminado con él:

Si especifica los valores no nulos para buffer_ptr o size_ptr, los valores devueltos en esas variables sólo son válidos hasta que libere el objeto de datos de envío recién creado. Puede usar estos valores como una forma rápida de acceder a los datos del nuevo objeto de datos .

Simplemente libera la variable new_data_file (ARC no lo hará por ti).

11

Desde iOS 7 y Mac OS X 10.9 (Foundation Release Notes) dispatch_data_t es un objeto NSO (NSObject <OS_dispatch_data>). dispatch_data_t ahora se puede convertir libremente a NSData *, aunque no al revés.

+2

Esto solo es cierto en iOS 7/10.9 –

+2

Thx, sí, agregué el enlace de la nota de la versión. – catlan

+0

¿Cuál será la solución para los demás? –