我有一个自定义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已开启。
答案 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])