6

如果我有一个来自一个 API 的 NSData* 并且需要将其转换为另一个 API 的 std::vector ,有没有办法安全地做到这一点而不复制 NSData 中的字节(假设一个非常大的 NSData *)?

4

2 回答 2

5

没有想到的快速解决方案,没有。

如果您创建 NSData 对象(而不是由另一个 API 返回),您可能会考虑子类化NSData和/或NSMutableData当您确实需要避免复制时——那么您可以直接访问存储 (std::vector)。

在某些情况下,您还可以通过使用“您的”分配创建数据来绕过它:

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

当然,您需要确保在NSData释放对象之前未调整向量的大小(或重新分配其后备存储)。

有时您还需要考虑更改参数类型,使其不是std::vector. 在容纳其他集合类型时,具有NSData成员和类似矢量的接口、迭代器或 begin+end 的小容器可能就足够了。

于 2013-05-27T22:48:43.857 回答
1

我对 stl 或 cpp 知之甚少,但如果你可以从 void* 缓冲区构造一个向量,那么你应该能够:

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

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

于 2013-05-28T00:14:53.233 回答