2013-05-27 12 views
6

Jeśli mam NSData * z jednego API i muszę zamienić to na std :: vector dla innego API, czy istnieje sposób na bezpieczne wykonanie tego procesu bez kopiowania bajtów w NSData (zakładamy bardzo dużą NSData *)?NSData * na std :: wektor <unsigned char> Bez kopii

+0

Możliwe, że możesz utworzyć niestandardowy przydział (drugi parametr szablonu z 'std :: vector'), który to robi, ale nie sądzę, że jest coś nieoczekiwanego, co zrobiłoby to za ciebie . –

Odpowiedz

4

Brak szybkiego rozwiązania, które przychodzi na myśl, nie.

Jeśli utworzysz obiekt NSData (a nie zostanie on zwrócony przez inny interfejs API), możesz rozważyć podklasy NSData i/lub NSMutableData, kiedy naprawdę potrzebujesz ominąć kopię - wtedy możesz uzyskać dostęp do magazynu (std :: wektor) bezpośrednio.

może także być w stanie podkraść się wokół niego w niektórych przypadkach poprzez stworzenie dane z „swojej” Przeznaczenie:

NSData * data([[NSData alloc] 
       initWithBytesNoCopy:vector.data() 
           length:vector.size() 
         freeWhenDone:false]); 

oczywiście, trzeba upewnić się, że wektor nie jest zmieniany (lub jej podkład ponowne przydzielenie pamięci) przed zwolnieniem obiektu NSData.

Czasami należy również rozważyć zmianę typu parametru, aby nie był to std::vector. Mały pojemnik z elementem NSData i interfejsem podobnym do wektora, iteratorem lub początkiem + końcem może być wystarczający przy dostosowywaniu innych typów kolekcji.

1

nie wiem wystarczająco dużo o STL lub CPP, ale czy można skonstruować wektor z pustce * bufor to powinieneś być w stanie z:

void * buffer = [data bytes]; 
size_t len = [data length]; 

pamiętać, że dane jest właścicielem bufor, więc nie możesz go uwolnić.