这个问题可能太模糊而无法通过StackOverflow's
标准,但我必须尝试发布它,因为我没有选择......:/
长话短说:我有一个应用程序会经历随机的缓慢期。它不会经常发生(可能每月一次),但是当它只完全重新启动它运行的 iDevice 时会有所帮助。症状是: 2-3 秒的响应时间和缓慢、断断续续的动画;整个应用程序基本上变得无法使用。
我已经通过所有可能的诊断工具运行了该应用程序,但都没有发现任何问题;没有内存泄漏或异常高的 CPU 使用率。但是,这并不奇怪,因为该应用程序非常简单,是一款纸牌游戏的追踪器应用程序。
所有这一切让我相信,AVAudioPlayer
当用户点击 a 时,我用来播放声音的button
可能是问题的原因(它是整个应用程序中唯一的、相对复杂度较高的元素)。但是,我不确定,这是我需要帮助的地方。我在这里包含了一个示例代码,也许有iOS
音频播放经验的人可以查看它,看看是否有我忽略的错误。
我们开始吧:首先,我初始化一个“静音播放器”,它每秒都在播放静音曲目以保持AVAudioPlayer
活力。这是必要的,因为AVAudioPlayer
在较长时间的不活动后被调用时会经历相对较长的响应时间。
NSString *silenceFilePath = [[NSBundle mainBundle] pathForResource: @"silence" ofType: @"wav"];
NSURL *silenceFileURL = [[NSURL alloc] initFileURLWithPath: silenceFilePath];
silencePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: silenceFileURL error: nil];
[silencePlayer setDelegate: self];
[silencePlayer prepareToPlay];
silenceTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(repeatSilence)
userInfo:nil
repeats:YES];
NSTimer 调用以下方法:
- (void) repeatSilence
{
if (isAudioON == YES)
{
if (silencePlayer.playing)
{
[silencePlayer stop];
silencePlayer.currentTime = 0;
[silencePlayer play];
}
else
{
[silencePlayer play];
}
}
}
其余的相当简单。我启动另一个 AVAudioPlayer 来播放特定的按钮声音(其中有两个):
NSString *buttonSoundFilePath = [[NSBundle mainBundle] pathForResource: @"button_pushed" ofType: @"wav"];
NSURL *buttonFileURL = [[NSURL alloc] initFileURLWithPath: buttonSoundFilePath];
buttonPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: buttonFileURL error: nil];
[buttonPlayer setDelegate: self];
[buttonPlayer prepareToPlay];
当按下按钮时,我会播放声音(与静音播放器的播放方式相同):
if (isAudioON == YES)
{
if (buttonPlayer.playing)
{
[buttonPlayer stop];
buttonPlayer.currentTime = 0;
[buttonPlayer play];
}
else
{
[buttonPlayer play];
}
}
真的是它的全部。然而,我担心,尽管这种方法很简单,但不知何故,这种连续的音频播放会造成 iOS 发疯的罕见实例。但这一切都只是一个理论,这就是为什么我需要有更多经验的人来看看我的代码并分享他的意见。
谢谢!
更新: 我发现另外几行代码也可能与问题相关。有了它们,我将 AVAudioPlayer 设置为与后台播放的音乐同时工作(例如,来自另一个应用程序):
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setDelegate:self];