我用一个非常简单的类包装AVAudioPlayer,允许我指定和url并立即播放它然后调用一个完成块,如下所示:
[AudioPlayer playAudioWithURL:url
completionBlock:^{
//finished playing
}];
我写这个的原因是因为它非常容易,简单。不需要实现委托等...问题是,这不起作用。在函数中执行此操作显然会将其分配到堆栈中,并且很快将被解除分配,导致声音停止播放。
那么,实现这种包装器的最佳方法是什么,在声音播放完毕之前保持参考? 感谢
答案 0 :(得分:0)
你不应该有任何问题。是什么让你认为它“显然会在堆栈中分配它并且很快将被解除分配”?你试过吗?你显然不太了解Objective-C中的内存管理是如何工作的。
在playAudioWithURL:urlcompletionBlock:
的实现中,您将不可避免地拥有某种异步调度。这个调度将不可避免地要保留你的音频播放器对象,以便让它发挥作用。所以不,它不会被取消分配,除非你做错了。
答案 1 :(得分:-1)
我不确定这有多大可能会使用ARC,因为您无法真正管理保留/释放周期。我使用UIAlertView
的包装器做了类似的事情,我所做的 - 当然不使用ARC - 只是在包装类中调用[self retain]
。 show
方法,然后,当在包装器上调用委托方法时,调用completionBlock
,然后调用[self release]
。这保证了(只要你遵循保留/释放规则!)包装类至少会在调用回调之前处于活动状态,并且在通常的情况下,包装器一旦完成它的工作就会自杀。同样,由于您无法使用ARC管理保留周期,我不确定这是否有效。
您可以选择简单地继承AVAudioPlayer
或创建其类别版本,将委托设置为自身。这可能能够让它保持足够长的时间以使其持续直到完整的声音播放 - 尽管我对ARC的工作方式有点模糊。
祝你好运!