如何保持强有力的参考?

时间:2012-08-28 12:29:02

标签: objective-c ios cocoa-touch automatic-ref-counting

我用一个非常简单的类包装AVAudioPlayer,允许我指定和url并立即播放它然后调用一个完成块,如下所示:

[AudioPlayer playAudioWithURL:url
                  completionBlock:^{
                      //finished playing
                  }];

我写这个的原因是因为它非常容易,简单。不需要实现委托等...问题是,这不起作用。在函数中执行此操作显然会将其分配到堆栈中,并且很快将被解除分配,导致声音停止播放。

那么,实现这种包装器的最佳方法是什么,在声音播放完毕之前保持参考? 感谢

2 个答案:

答案 0 :(得分:0)

你不应该有任何问题。是什么让你认为它“显然会在堆栈中分配它并且很快将被解除分配”?你试过吗?你显然不太了解Objective-C中的内存管理是如何工作的。

playAudioWithURL:urlcompletionBlock:的实现中,您将不可避免地拥有某种异步调度。这个调度将不可避免地要保留你的音频播放器对象,以便让它发挥作用。所以不,它不会被取消分配,除非你做错了。

答案 1 :(得分:-1)

我不确定这有多大可能会使用ARC,因为您无法真正管理保留/释放周期。我使用UIAlertView的包装器做了类似的事情,我所做的 - 当然不使用ARC - 只是在包装类中调用[self retain]show方法,然后,当在包装器上调用委托方法时,调用completionBlock,然后调用[self release]。这保证了(只要你遵循保留/释放规则!)包装类至少会在调用回调之前处于活动状态,并且在通常的情况下,包装器一旦完成它的工作就会自杀。同样,由于您无法使用ARC管理保留周期,我不确定这是否有效。

您可以选择简单地继承AVAudioPlayer或创建其类别版本,将委托设置为自身。这可能能够让它保持足够长的时间以使其持续直到完整的声音播放 - 尽管我对ARC的工作方式有点模糊。

祝你好运!