2012-02-05 18 views
8

Czy to właściwa droga?Jak przekonwertować dispatch_data_t na 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 * 

Działa poprawnie. Moją główną troską są wycieki pamięci. Przeciekanie buforów danych nie jest zabawne. Czy NSData, bufor i dispatch_data_t new_data_file są w porządku?

Z tego co mogę przeczytać na http://opensource.apple.com/source/libdispatch/libdispatch-187.7/dispatch/data.c wydaje się, że bufor to DISPATCH_DATA_DESTRUCTOR_FREE. Czy to oznacza, że ​​moim obowiązkiem jest uwolnić bufor?

Odpowiedz

3

W większości przypadków kod jest prawidłowy. +initWithBytes:length: skopiuje bufor wysłany w taki sposób, że nie musisz martwić się o zwolnienie bufora po danych, możesz bezpiecznie zwolnić dane w pierwszej kolejności.

Zgodnie z dokumentacją, nie uwolnić dane po zakończeniu z nim:

przypadku określenia wartości non-NULL dla buffer_ptr lub size_ptr, wartości zwracane w te zmienne są ważne tylko do momentu zwolnienia nowo utworzonego obiektu danych dotyczących przesyłania danych: . Możesz użyć tych wartości jako szybki sposób dostępu do danych nowego obiektu danych .

Po prostu zwolnij zmienną new_data_file (ARC nie zrobi tego za Ciebie).

11

Ponieważ iOS 7 i Mac OS X 10.9 (Foundation Release Notes) dispatch_data_t to obiekt NSObject (NSObject <OS_dispatch_data>). dispatch_data_t może teraz być dowolnie rzutowany na NSData *, ale nie na odwrót.

+2

Dotyczy to tylko iOS 7/10.9 –

+2

Thx, tak, dodałem link uwaga do wydania. – catlan

+0

Jakie będzie rozwiązanie dla innych? –