2017-01-23 164 views
0

我有一個自定義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 observerdealloc

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

ARC被打開。

回答

4

從蘋果開發者發佈Notes

在OS X 10.11和iOS 9.0 NSNotificationCenter和NSDistributedNotificationCenter將不再發送通知可能被釋放註冊的觀察員。

這意味着你不需要從iOS 9或OS X 10.11中刪除觀察者。

1

你應該在dealloc中刪除。

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

我也在dealloc中看到它,請參閱編輯,但爲什麼我不需要每次刪除它時都要刪除我正在觀察的對象? – SIMEL

+0

之前ios 9意味着在ios8它崩潰,因爲它試圖發送消息後也釋放,但在ios9如果資源未找到它自動removeObserver。 –

+0

那麼我需要將embedUrl中的remove刪除嗎? – SIMEL

0

如果您確定,視圖控制器將彈出,然後刪除觀察者。

override func viewWillDisappear(animated: Bool) 
{ 
    super.viewWillDisappear(animated) 
    if self.isMovingFromParentViewController() 
    { 
     //View controller was popped 
     //Remove any observer. 
    } 
}