【问题标题】:memcpy() leading to EXC_BAD_ACCESS in iOSmemcpy() 在 iOS 中导致 EXC_BAD_ACCESS
【发布时间】:2014-10-13 22:56:15
【问题描述】:

我在我的套接字接收函数上得到了NSData,我试图在我的音频类的tempbuffer 中复制该数据,我正在使用外部类型全局变量来执行此操作。

这是我的代码:

memcpy([recorder tempBuffer].mdata,(__bridger const void *)data,data.length);

这里的录音机是我extern类型的音频类全局变量。

当控制到达这行代码时抛出异常,可能是什么错误。

【问题讨论】:

  • 你为什么要复制它?

标签: ios objective-c nsdata memcpy


【解决方案1】:

如果目标缓冲区确实是您使用mallocuint8_t(或等效)分配的缓冲区,您应该:

  1. 检查以确保目标缓冲区足够大以容纳整个 data 内容。

  2. 不要尝试将NSData 转换为(void *) 指针,而是使用:

    memcpy(destination, data.bytes, data.length);
    

    如果NSData 不在连续块中(在iOS 7 及更高版本中可能不是),data.bytes 会将其复制到连续缓冲区,然后您可以将其与memcpy 一起使用。

  3. 或者更好的是,您可以通过完全删除 memcpy 来避免这种冗余副本:

    [data getBytes:destination length:data.length];
    

    如果NSData 不在连续块中,这将避免让data.bytes 将其复制到连续缓冲区,然后您将使用memcpy 再次复制该缓冲区。

    归根结底,NSData 具有丰富的接口,应该消除您自己使用低级 memcpy 调用的需要。

从问题中,不清楚[recorder tempBuffer].mdata 是什么以及您如何分配它,所以也许您可以澄清一下。希望这不是您要复制到的另一个 NSData 对象。

【讨论】:

  • 我会考虑第三个选项,但我的 tempbuffer 是一个结构而不是 NSData
  • 第三个选项不要求目的地,你的tempBuffer,是NSData(事实上,最好不是)。 getBytes 用于将字节 NSData 复制到某个任意缓冲区。
【解决方案2】:

这里真的有三种可能:

  1. [recorder tempBuffer].mdata 不是有效指针。 (例如,它是什么类型?如果它是 NSMutableData,您应该访问它的 mutableBytes 属性。)
  2. [recorder tempBuffer].mdata 不是足够大小的有效指针 (data.length)。
  3. (__bridger const void *)data 不是足够大小的有效指针。

在这三个中,我可以保证#3 需要解决。 NSData 本身并不是你想要的数据,而是一个包装你想要的数据的对象。此处不应使用网桥,而应使用data.bytes

另外两个,我帮不了你。我不知道mdata 是什么类型或分配在哪里。

【讨论】:

  • 不会导致崩溃;目的地更有可能是NULL
  • 如果块边缘被足够大的长度侵犯,它可以。但是,是的,检查目标是否为 null 也是一个好主意。 然而:这里肯定需要我推荐的改变。
  • 当然;但这并不是绝对的原因。
  • 更新:我已经验证在我描述的情况下会返回一个 EXC_BAD_ACCESS。
  • 我没有说“绝对不是”,我说的是“不确定”,但是您在编辑中解决了其他可能的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2016-11-19
  • 2012-10-02
  • 2011-04-14
相关资源
最近更新 更多