2013-05-27 63 views
6

如果我有一個API的NSData *,需要將它轉換爲另一個API的std :: vector,有沒有辦法在不復制的情況下安全地執行此操作NSData中的字節(假設非常大的NSData *)?NSData * to std :: vector <unsigned char>不帶複製

+0

您可能可以創建一個自定義分配器(std :: vector的第二個模板參數),但我認爲沒有任何開箱即可爲您做到這一點。 –

回答

4

想到沒有快速解決方案,沒有。如果你創建NSData對象(而不是由另一個API返回),你可能會考慮繼承NSData和/或NSMutableData,當你真的需要避免複製 - 那麼你可以訪問存儲(std ::矢量)直接。

您可能還可以圍繞它偷偷在某些情況下,通過創建一個「你」分配數據:

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

,你需要確保矢量沒有調整(或它的後盾存儲重新分配)之前NSData對象被釋放。

有時您還需要考慮更改參數類型,以使其不是std::vector。一個包含NSData成員和向量類接口,迭代器或begin + end的小容器在適應其他集合類型時可能已足夠。

1

我不知道有足夠的瞭解STL或CPP,但如果你能構建從虛空矢量*緩衝區,那麼你應該能夠有:

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

記住,數據擁有緩衝區,所以你可能無法釋放它。

相關問題