NSData *到std :: vector <unsigned char =“”>没有复制</unsigned>

时间:2013-05-27 22:29:38

标签: objective-c nsdata stdvector

如果我从一个API获得NSData *并且需要将其转换为另一个API的std :: vector,那么有没有办法安全地执行此操作而不复制NSData中的字节(假设一个非常大的NSData *) ?

2 个答案:

答案 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];

请记住,数据拥有缓冲区,因此您可能无法释放它。