我的套接字接收功能正在NSData
,我试图在我的音频类的tempbuffer
中复制该数据,我正在使用外部类型全局变量来执行此操作。
这是我的代码:
memcpy([recorder tempBuffer].mdata,(__bridger const void *)data,data.length);
此处记录器是音频类的extern
类型全局变量。
当控制到达这行代码时,抛出异常,可能是错误。
答案 0 :(得分:5)
这里有三种可能性:
[recorder tempBuffer].mdata
不是有效指针。 (例如,它是什么类型?如果它是 NSMutableData ,您应该访问其mutableBytes
属性。)[recorder tempBuffer].mdata
不是足够大小的有效指针(data.length
)。(__bridger const void *)data
不是足够大小的有效指针。在三者中,我可以保证#3需要解决。 NSData 本身不是您想要的数据,而是包装所需数据的对象。您应该使用data.bytes
。
mdata
的类型或分配的位置。
答案 1 :(得分:0)
如果目标缓冲区确实是您使用malloc
或uint8_t
(或等效)缓冲区分配的缓冲区,则应该:
检查以确保目标缓冲区足以容纳整个data
内容。
不要尝试将NSData
强制转换为(void *)
指针,而是使用:
memcpy(destination, data.bytes, data.length);
如果NSData
不在连续的块中(在iOS 7及更高版本中可能不是),data.bytes
会将其复制到连续的缓冲区,然后您可以将其用于{ {1}}。
或者更好的是,您可以通过完全删除memcpy
来避免此冗余副本:
memcpy
如果[data getBytes:destination length:data.length];
不在一个连续的块中,这将避免让NSData
将其复制到一个连续的缓冲区,然后再用data.bytes
复制它。
底线memcpy
有一个丰富的界面,无需自己使用低级NSData
来电。
从问题来看,目前尚不清楚memcpy
是什么以及你如何分配它,所以也许你可以澄清一下。希望这不是你想要复制的另一个[recorder tempBuffer].mdata
对象。