我基于 Apple 的 SpeakHere 音频应用程序示例编写了一个小型录音机/播放器以在我的 iPad 上使用。当用户要求显示记录器时,会打开一个 UIView 并显示记录/停止按钮和仪表。
当我从头开始加载应用程序时,我可以随时录制、停止录制、再次录制。停止录制后,我将应用程序置于后台,例如阅读我的邮件。再次将录音机置于前台时,无法录制任何声音。我在日志中收到一条错误消息,仪表不显示任何数据,也没有创建声音文件。我注意到 SpeakHere 示例应用程序在 iPhone 和 iPad 上的行为相同。唯一的解决方案是退出并重新启动应用程序。
为了解决这个问题,我决定在用户使用完记录器后释放视图控制器。我为记录视图控制器禁用了 ARC,并编写了它的 dealloc 方法。在这个控制器的 viewDidDisappear 中,我放了一个[self dealloc]调用。
但是程序崩溃了,发送一个[RecorderViewController childViewControllersCount]: 消息发送到 deallocated instance。我想这样的自我释放是不允许的......
我需要找到解决方案,要么...
找到一种在应用程序进入后台时正确管理音频会话的方法(因为录制停止,我不明白为什么会出现这样的问题)。
或者在视图关闭时正确释放记录器视图控制器,以确保在任何时候必须出现视图时,它会从控制器的 XIB 文件中再次加载。
[更新]在查看 aurioTouch 应用程序的代码(Apple 开发网站的另一个音频示例)后,我在我的应用程序委托中使用了以下代码:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
AudioSessionSetActive(true);
}
它可以在我的应用程序或 SpeakHere 应用程序中工作......花了几个小时寻找解决方法,它是一行代码!