2013-05-27 62 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]; 

记住,数据拥有缓冲区,所以你可能无法释放它。

相关问题