AVPlayer注意点

我们近期做了一个音频播放的功能(AVPlayer、AVPlayerItem)工具类中这样写:

 // 判断当前有没有正在播放的item
if (self.player.currentItem) {
     // 移除观察者
     [self.player.currentItem removeObserver:self forKeyPath:@"status"];
     [self.player.currentItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
 }
        
// 创建新的item
self.item = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
      
[self.item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
[self.item addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
    
/// 异步加载
[self.player replaceCurrentItemWithPlayerItem:self.item];

因为每个页面都会有播放视图,比如A页面、B页面都含有音频视图以及功能,当从A页面push到B页面, B在加载音频成功之前(由于需求原因,写的播放工具类并不是单例模式),pop视图,崩溃了:

- [Class retain]: message sent to deallocated instance 0xxxxx(对象地址)

我理解的意思是,在pop上一个界面的时候,本界面的播放工具类是局部变量会被释放掉,但是在释放之后,还在被访问(正在监听加载音频),解决办法:

- (void)dealloc{
    // 移除观察者  否则会崩溃
    [self.player.currentItem removeObserver:self forKeyPath:@"status"];
    [self.player.currentItem removeObserver:self forKeyPath:@"loadedTimeRanges"];
    // 关闭定时器
    [self closeTimer];
}

Over!

你可能感兴趣的:(AVPlayer注意点)