如果我从一个API获得NSData *并且需要将其转换为另一个API的std :: vector,那么有没有办法安全地执行此操作而不复制NSData中的字节(假设一个非常大的NSData *)?
解决方法
没有想到的快速解决方案,没有.
如果您创建NSData对象(而不是由另一个API返回),您可能会考虑在确实需要避免副本时继承NSData和/或NSMutableData – 然后您可以直接访问存储(std :: vector).
在某些情况下,您可以通过使用“您的”分配创建数据来绕过它:
NSData * data([[NSData alloc] initWithBytesNoCopy:vector.data() length:vector.size() freeWhenDone:false]);
当然,您需要确保在释放NSData对象之前不调整向量(或重新分配其后备存储).
有时您还需要考虑更改参数类型,使其不是std :: vector.在容纳其他集合类型的同时,具有NSData成员和类似矢量的接口,迭代器或begin end的小容器可能是足够的.