我首先要做的是添加观察者调用
然后在通知功能中删除观察者。
我确信我在堆栈上看到了removerObserver 但是,应用程序崩溃,好像通知中心遗留了错误的内存引用。
我认为有两种可能性
我正在打苹果虫
我的调用顺序错误
这是我的playvideo功能代码
//Initialize a MPMoviePlayerController object with the movie.
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
[[NSNotificationCenter defaultCenter] addObserver:self
selector: @selector(movieReadyPlayMovieNow:)
name:MPMoviePlayerContentPreloadDidFinishNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector: @selector(moviePlayBackFinished:)
name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
这是电影预加载时调用的通知
- (void) movieReadyPlayMovieNow:(NSNotification*)notification {
@try {
if(moviePlayer != nil){
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerContentPreloadDidFinishNotification
object:moviePlayer];
[moviePlayer play];
}
}
catch(id exception) {
NSLog(@"Error playing.");
}
}
答案 0 :(得分:0)
您正在从任意(零)对象的name:MPMoviePlayerContentPreloadDidFinishNotification
通知中注册:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieReadyPlayMovieNow :) name:MPMoviePlayerContentPreloadDidFinishNotification object:nil ];
但是您要从moviePlayer
对象中取消注册。
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerContentPreloadDidFinishNotification object:moviePlayer ];
尝试在两者上注册对象nil
,或在两者上注册moviePlayer
,看看是否能解决问题。
答案 1 :(得分:0)
在通知中运行时删除通知可能是一件坏事。
尝试在单独的方法中删除通知,并使用performSelector:withObject:afterDelay使用零延迟或使用performSelectorOnMainThread:调用该方法。其中任何一个都将完成当前的运行循环,然后将在通知调用之外执行removeObserver方法。