不可靠的动作removeObserver:iPhone视频播放

时间:2009-12-08 23:22:13

标签: iphone cocoa-touch

我首先要做的是添加观察者调用

然后在通知功能中删除观察者。

我确信我在堆栈上看到了removerObserver 但是,应用程序崩溃,好像通知中心遗留了错误的内存引用。

我认为有两种可能性

  1. 我正在打苹果虫

  2. 我的调用顺序错误

  3. 这是我的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.");
       } 
    } 
    

2 个答案:

答案 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方法。