memcpy()导致iOS中的EXC_BAD_ACCESS

时间:2014-08-20 14:19:35

标签: ios objective-c nsdata memcpy

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

这是我的代码:

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

此处记录器是音频类的extern类型全局变量。

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

2 个答案:

答案 0 :(得分:5)

这里有三种可能性:

  1. [recorder tempBuffer].mdata不是有效指针。 (例如,它是什么类型?如果它是 NSMutableData ,您应该访问其mutableBytes属性。)
  2. [recorder tempBuffer].mdata不是足够大小的有效指针(data.length)。
  3. (__bridger const void *)data不是足够大小的有效指针。
  4. 在三者中,我可以保证#3需要解决。 NSData 本身不是您想要的数据,而是包装所需数据的对象。您应该使用data.bytes

    ,而不是在此处使用网桥 另外两个,我帮不了你。我不知道mdata的类型或分配的位置。

答案 1 :(得分:0)

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

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

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

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

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

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

    memcpy

    如果[data getBytes:destination length:data.length]; 不在一个连续的块中,这将避免让NSData将其复制到一个连续的缓冲区,然后再用data.bytes复制它。

    底线memcpy有一个丰富的界面,无需自己使用低级NSData来电。

  4. 从问题来看,目前尚不清楚memcpy是什么以及你如何分配它,所以也许你可以澄清一下。希望这不是你想要复制的另一个[recorder tempBuffer].mdata对象。