如果我从一个API获得NSData *并且需要将其转换为另一个API的std :: vector,那么有没有办法安全地执行此操作而不复制NSData中的字节(假设一个非常大的NSData *) ?
答案 0 :(得分:5)
没有想到快速解决方案,没有。
如果您创建NSData对象(而不是由另一个API返回),您可能会考虑在确实需要避免复制时对NSData
和/或NSMutableData
进行子类化 - 那么您可以直接访问存储(std :: vector)。
在某些情况下,您可以通过使用“您的”分配创建数据来隐藏它:
NSData * data([[NSData alloc]
initWithBytesNoCopy:vector.data()
length:vector.size()
freeWhenDone:false]);
当然,在释放NSData
对象之前,您需要确保未调整向量大小(或重新分配其后备存储区)。
有时您还需要考虑更改参数类型,使其不是std::vector
。在容纳其他集合类型的同时,一个具有NSData
成员和类似矢量的接口,迭代器或开始+结束的小容器可能就足够了。
答案 1 :(得分:1)
我对stl或cpp知之甚少,但是如果你可以从void * buffer构造一个向量,那么你应该可以使用:
void * buffer = [data bytes];
size_t len = [data length];
请记住,数据拥有缓冲区,因此您可能无法释放它。