2013-05-27 24 views
6

Bir API'den bir NSData * varsa ve bunu başka bir API için bir std :: vektörüne dönüştürmem gerekirse, bunu kopyalamadan güvenle yapmanın bir yolu var mı NSData'daki baytlar (çok büyük bir NSData * varsayalım)?NSData * to std :: vektör <imzasız char> Kopyalama Olmadan

+0

Bunu yapan özel bir ayırıcı ('std :: vektör''ün ikinci şablon parametresi) oluşturabilirsiniz, ancak bunu sizin için yapacak bir kutu olduğunu düşünmüyorum. . –

cevap

4

Akla gelen hızlı bir çözüm yok, no. Eğer (başka API tarafından iade edilen ziyade) NSData nesnesi oluşturursanız, gerçekten kopya önlemek için gerektiğinde

, sen NSData ve/veya NSMutableData sınıflara düşünebilirsiniz - o zaman depolama erişebilir (std :: vektör) doğrudan.

Ayrıca senin 'tahsisi ile veri oluşturarak bazı durumlarda etrafında gizlice mümkün olabilir: elbette

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

, vektör resized (veya arka olmadığından emin olmak gerekir NSData nesnesinden ayrılmadan önce mağaza yeniden ayrıldı.

Bazen, parametre türünü std::vector olarak değiştirmeyecek şekilde değiştirmeyi düşünmeniz gerekir. NSData üyesi ve vektör benzeri bir arabirime sahip olan küçük bir kapsayıcı, yineleyici veya başlangıç ​​+ bitiş, diğer koleksiyon türlerini barındırırken yeterli olabilir.

1

Ben stl ya cpp'de hakkında yeterince bilgimiz yok, ama bir boşluktan bir vektör yapılandırmak eğer * tampon o zaman ile mümkün olmalıdır: Veri sahibi olduğunu

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

akılda tutmak arabellek böylece serbest olmayabilir.

İlgili konular