【问题标题】:NSData* to std::vector<unsigned char> Without CopyNSData* 到 std::vector<unsigned char> 没有复制
【发布时间】:2013-05-27 22:29:38
【问题描述】:

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

【问题讨论】:

  • 您也许可以创建一个自定义分配器(std::vector 的第二个模板参数)来执行此操作,但我认为没有任何开箱即用的功能可以执行此操作给你。

标签: objective-c nsdata stdvector


【解决方案1】:

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

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

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

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

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

有时您还需要考虑更改参数类型,使其不是std::vector。一个包含NSData 成员和类似矢量的接口、迭代器或开始+结束的小容器可能就足够了,同时容纳其他集合类型。

【讨论】:

    【解决方案2】:

    我对 stl 或 cpp 了解不够,但如果您可以从 void* 缓冲区构造向量,那么您应该能够:

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多