我构建的应用程序本质上是一个带有十个按钮的工具,每个按钮链接到一个单独的AVAudioPlayer
。当我尝试在ViewDidLoad方法中为每个AVAudioPlayer
分配和初始化内存时,我没有得到任何错误,但是每个按钮的响应性都滞后,并且在再次触发/听到相同的按钮之前有相当大的延迟时间。我已经通过实施下面的代码来纠正这种情况,但是我并不相信它是处理内存的正确方法,特别是因为我有10种这样的方法。
- (IBAction)note1:(id)sender {
url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"note1" ofType:@"wav"]];
unit1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:nil];
[unit1 play];
}
答案 0 :(得分:0)
你可以尝试一件事,
在播放该文件之前调用prepareToPlay
AVAudioPlayer
方法。
答案 1 :(得分:0)
您当前代码的问题在于,每次拨打AVAudioPlayer
时都要创建-note1:
的新实例。您可以尝试这种改进:
- (IBAction)note1:(id)sender {
if (!url1)
url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"note1" ofType:@"wav"]];
if (!unit1)
unit1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:nil];
[unit1 play];
}
但最好的方法是在加载AVAudioPlayers
时在一个地方初始化UIViewController
:
- (void) initializePlayers {
url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"note1" ofType:@"wav"]];
unit1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:nil];
}
- (void) viewDidLoad {
[self initializePlayers];
}
- (IBAction)note1:(id)sender {
[unit1 play];
}
答案 2 :(得分:0)
加载视图后进行任何其他设置,通常是从笔尖。
NSURL* url = [[NSBundle mainBundle] URLForResource:@"Rondo_Alla_Turka_Short" withExtension:@"aiff"];
NSAssert(url, @"URL is valid.");
NSError* error = nil;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if(!self.player)
{
NSLog(@"Error creating player: %@", error);
}