我有一個自定義UITableViewCell
其中有一個AVPlayer
。我向playerItem
添加了一位觀察者,瞭解視頻何時到達結尾。單元格可以獲得一個新文件,在這種情況下,它將用新實例替換player
和playerItem
。在之前我添加觀察者的時候,我不得不在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被打開。
我也在dealloc中看到它,請參閱編輯,但爲什麼我不需要每次刪除它時都要刪除我正在觀察的對象? – SIMEL
之前ios 9意味着在ios8它崩潰,因爲它試圖發送消息後也釋放,但在ios9如果資源未找到它自動removeObserver。 –
那麼我需要將embedUrl中的remove刪除嗎? – SIMEL