2
-(void) setupAVPlayerForURL:(NSString *)url
{
    [appdelegate.sharedplayer stop];

    appdelegate.sharedplayer=[[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:NULL];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    [appdelegate.sharedplayer setVolume:appdelegate.volumeDelegate];

    [appdelegate.sharedplayer play];
    self.seekBarSlider.minimumValue = 0.0f;
    self.seekBarSlider.maximumValue = appdelegate.sharedplayer.duration;
    self.isPlaying=YES;
    appdelegate.sharedplayer.delegate=self;

    [self loadAlbumArt];
    [appdelegate.sharedplayer  addObserver:self forKeyPath:@"status" options:0 context:nil];
}

除了第一次运行此应用程序时,我都会收到此日志消息但应用程序没有崩溃

An instance 0xc1693d0 of class AVAudioPlayer was deallocated while key value observers were still registered with it. 
Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on  NSKVODeallocateBreak to stop here in the debugger. 

这是当前的观察信息:

<NSKeyValueObservationInfo 0xc194d90> (
 <NSKeyValueObservance 0xc194e40: Observer: 0xc1697d0, Key path:
 status, Options: <New: NO, Old: NO, Prior: NO>         Context: 0x0,
 Property: 0xc194d70> )

我做错了什么??

4

2 回答 2

6

您必须self从观察者中删除。当您调用-stop时,实例AVAudioPlayer会被释放(您创建一个新实例)。但是你试图继续保留它的价值。

因此,您尝试观察一个不再存在于内存中的实例。

尝试这个:

- (void)setupAVPlayerForURL:(NSURL *)url {
    [[appdelegate sharedplayer] removeObserver:self];
    [[appdelegate sharedplayer] stop];

    // and so on
}

您的应用程序没有崩溃,因为您访问了已释放的实例。而是系统“崩溃”了您的应用程序,因为被观察对象的内存地址(然后被释放)可能稍后会指向其他对象,这会导致错误的观察消息被分派给您的观察者。

于 2013-10-23T15:14:55.297 回答
1

移除观察者后将 avPlayerLayer 设置为 nil

[avPlayerLayer removeObserver:self forKeyPath:@"readyForDisplay"];
 avPlayerLayer=nil;

在 viewdisappear 检查 avPlayerLayer 不是 nil 然后删除观察者

if (avPlayerLayer)
{
    [avPlayerLayer removeObserver:self forKeyPath:@"readyForDisplay"];
}
于 2014-11-04T08:47:36.183 回答