AVPlayerの「レート」を追跡するためにオブザーバを作成しました。 AVPlayerのレートが期待どおりに変化するたびに、オブザーバーの通知が提示されます。私は再生がAVPlayerが再生されていることを項目に終了したときにオブザーバを削除しようとすると、しかし、私は、次のクラッシュを取得:removeObserver:forKeyPath:keyPath通知中にクラッシュする
*** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <MediaController 0x10181e000> for the key path "rate" from <NSNotificationCenter 0x1740da080> because it is not registered as an observer.'
観察者が私のために登録する必要がありますので、これは意味がありません。観察者を取り除く。言い換えれば、オブザーバーを削除するポイントは、オブザーバー通知を受け取るためのハンドラーにあります。明らかに、オブザーバーは登録されています。ここではオブザーバを作成するために、私の関連するコードです:仕上げを再生している項目は、次のハンドラコードがオブザーバー通知受信時に実行された後
AVPlayerItem *item = [[AVPlayerItem alloc]initWithURL:address];
moviePlayer = [[AVPlayer alloc]initWithPlayerItem:item];
[moviePlayer addObserver:self
forKeyPath:@"rate"
options:NSKeyValueObservingOptionNew
context:NULL];
:removeObserverの実行時
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"rate"]) {
float rate = [change[NSKeyValueChangeNewKey] floatValue];
if (rate == 0.0) {
// Playback stopped
if (CMTimeGetSeconds(moviePlayer.currentTime) >=
CMTimeGetSeconds(moviePlayer.currentItem.duration)) {
// Playback reached end
// Remove further notifications until the next time we need the movie player
[[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"rate"];
を、アプリのクラッシュが発生します。 & moviePlayerのnull以外のコンテキストを追加しようとしましたが、そのコンテキストでオブザーバーを削除しましたが、それでもクラッシュします。私も削除を遅らせてみましたが、それでも問題は解決しません。
このクラッシュを避けるために私は何が欠けていますか?