【发布时间】:2012-09-08 18:20:23
【问题描述】:
我已经实现了一个递减计数器,它每秒播放一次点击声音,直到它的计时器失效。同时,我正在显示计数器值。
-(IBAction)start{
myTicker =[NSTimerscheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showactivity) userInfo:nil repeats:YES];
}
-(void)showactivity;{
int CurrentTime =[time.textintValue];
NSString *soundFilePath=[[NSBundlemainBundle] pathForResource:@"Click03" ofType:@"wav"];
NSURL *soundFileURL =[NSURLfileURLWithPath:soundFilePath];
AVAudioPlayer *player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
player.numberOfLoops =1;
[player play];
int newTime = CurrentTime-1;
time.text = [NSString stringWithFormat:@"%d",newTime];
if(newTime ==0){
[myTicker invalidate];
time.text = @"0";
}
}
计数器运行良好,但初始延迟很小;但它不播放声音,谁能帮我有效地实现这个概念,以最小的延迟等......
【问题讨论】:
-
如果你使用
ARC,本地AVAudioPlayer对象将在块完成后自动释放。因为没有其他强指针可以让它保持活力,所以没有机会听到/播放你的声音......解决方案是在你的类中使用全局实例而不是本地AVAudioPlayer实例。 -
@holex - 是的,它适用于全局,然后我需要在 ViewDidLoad 中加载声音文件并在 -(void)showactivity{} 中使用它,这是一种更好的编程技术吗?我认为编程不仅仅是按预期完成工作,而是以最聪明的方式! :)
-
如果你一直使用相同的音效,只加载一次会更容易,即在
-viewDidLoad方法中。这样可以节省一些资源。
标签: ios xcode avfoundation avaudioplayer