Cocoa 音频队列和EXC_坏访问
这是我使用音频队列生成噪音的代码: 问题是我的代码生成了一个EXC_BAD_访问。问题似乎出在作业上Cocoa 音频队列和EXC_坏访问,cocoa,core-audio,audioqueue,Cocoa,Core Audio,Audioqueue,这是我使用音频队列生成噪音的代码: 问题是我的代码生成了一个EXC_BAD_访问。问题似乎出在作业上 MAAudioManager *audioMngr = (__bridge MAAudioManager *) inUserData; 在回调例程中。 我怀疑这可能与MAAudioManager类线程的访问有关 有什么想法吗?程序中是否有其他地方保留了MAAudioManager实例?在调用回调时,它似乎已被解除锁定。你说得对。没有圆弧的相同程序运行良好。似乎ARC发布了MAAudi
MAAudioManager *audioMngr = (__bridge MAAudioManager *) inUserData;
在回调例程中。
我怀疑这可能与MAAudioManager类线程的访问有关
有什么想法吗?程序中是否有其他地方保留了
MAAudioManager
实例?在调用回调时,它似乎已被解除锁定。你说得对。没有圆弧的相同程序运行良好。似乎ARC发布了MAAudioManager实例。好的,我需要学习更好的弧线。同时,有没有关于如何避免圆弧释放对象的想法?谢谢您需要在某处保留一个指向MAAudioManager实例的指针。例如,您可以将其保存在创建它的对象的实例变量或应用程序委托中。在NSZombie打开的情况下进行调试也是一个好主意,您可以在“Scheme”对话框中执行此操作,该选项称为“Enable zombie objects”。启用该选项后,您将获得更多信息,而不仅仅是EXC_BAD_访问。实际上,您已经拥有MAAudioManager*audio=[[MAAudioManager alloc]init]应用程序代理中的代码>。可能我遗漏了什么,那是一个局部变量。一旦方法结束,变量将超出范围并被删除。这就是ARC释放对象的原因。您需要将audio
声明为实例变量,这意味着在应用程序委托@接口
部分(在头文件中)中声明它,如MAAudioManager*audio
。只要对象存在,一个声明存在的变量就会存在,对于应用程序委托,该变量就是应用程序的生命周期。然后,您可以用audio=[[MAAudioManager alloc]init]
替换发布的行。