我何时需要移除观察者

时间:2017-01-23 09:54:31

标签: ios objective-c

我有一个自定义UITableViewCell,其中包含AVPlayer。我被添加到playerItem的观察者,以了解视频何时到达终点。单元格可以获取要播放的新文件,在这种情况下,它会用新实例替换playerplayerItem。在以前我添加观察者时,我必须在dealloc中删除它,否则应用程序会崩溃。

这一次,我注意到即使我在删除playerItem之前没有移除观察者,一切正常。

为什么我不需要在这种情况下删除观察者?

@interface CallResultTableViewCell : UITableViewCell

@property (nonatomic, strong) AVPlayer *player;
@property (nonatomic, strong) AVPlayerItem *playerItem;
@property (nonatomic, strong) NSURL *url;

-(void) embedUrl:(NSURL *)url;

@end

-(void) embedUrl:(NSURL *)url {
    if (self.url == nil || ![self.url isEqual:url]) {
        if (self.player != nil) {
            [self.player pause];
            self.player = nil;
            //[[NSNotificationCenter defaultCenter] removeObserver:self
            //                                                name:AVPlayerItemDidPlayToEndTimeNotification
            //                                              object:self.playerItem];
            self.playerItem = nil;
            //...
        }
        if (url != nil) {
            self.playerItem = [myUrls playerItemWithURL:url];
            self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
            self.url = url;
            //...
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(itemDidFinishPlaying:)
                                                         name:AVPlayerItemDidPlayToEndTimeNotification
                                                       object:self.playerItem];
        }
    }
    [self.player play];
}

-(void)itemDidFinishPlaying:(NSNotification *) notification {
    [self.playerItem seekToTime:kCMTimeZero];
    [self.player play];
}

我也在remove observer中致电dealloc

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AVPlayerItemDidPlayToEndTimeNotification
                                                  object:self.playerItem];
}

ARC已开启。

3 个答案:

答案 0 :(得分:5)

来自Apple Developer Release Notes

  

在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能已解除分配的已注册观察者发送通知。

这意味着您无需从iOS 9或OS X 10.11中删除观察者。

答案 1 :(得分:1)

你应该删除dealloc。

 - (void)dealloc {
   [super dealloc];
    //add remove observer code
 }

答案 2 :(得分:0)

如果你确定,视图控制器将弹出,然后删除观察者。

=RANK.EQ(table1[OrderCount];table1[OrderCount])