- (voID) playClip: (NSData *)cliptoplay{ NSError *error = nil; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData: cliptoplay error:&error]; audioPlayer.numberOfLoops = 0; audioPlayer.volume = 1.0f; [audioPlayer preparetoPlay]; if (audioPlayer == nil) NSLog(@"%@",[error description]); else [audioPlayer play];}
可以看出,cliptoplay包含一个声音片段作为NSData.这段代码的行为很奇怪.如果我在调试器中运行它并在以下行设置断点:
[audioPlayer play];
剪辑按预期播放 – 调试器在线上暂停,当您单步执行时,剪辑可以完美播放.但是,如果我把断点拿出来,它根本就不会播放.
我已经尝试将NSData首先复制到临时文件,结果完全相同.我还将cliptoplay复制到另一个变量(使用副本,而不仅仅是指针赋值),结果相同(我想也许cliptoplay在某处被破坏).我没有收到错误记录.
我真的坚持为什么暂停调试器的播放方法会导致这种情况发生.有什么建议或想法吗?
解决方法 好吧,我发现了这个问题,所以我会回答我自己的问题,所以也许它会在未来的某个时候拯救别人.问题是AVAudioPlayer在有机会播放声音之前被解除分配.当在断点处停止时,显然有机会在解除分配之前播放声音.
在这个例子中,因为它在它自己的子类中,所以我使audioPlayer成为一个ivar而且我在变量视图控制器中创建了保持对子类的引用的变量ivar.这样可以在声音未播放时阻止重新分配.
在子类中,我在委托方法中找不到audioPlayer指针:
- (voID)audioPlayerDIDFinishPlaying:(AVAudioPlayer *)player successfully:(BOol)flag
我不确定这种安排的最终形式是什么,但这至少解释了导致问题的原因. AVAudioPlayer实例必须在其范围内,直到声音完成播放或ARC将解除分配.
总结以上是内存溢出为你收集整理的iOS AVAudioPlayer奇怪的行为全部内容,希望文章能够帮你解决iOS AVAudioPlayer奇怪的行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)