我有以下代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreen:)
name:MPMoviePlayerWillEnterFullscreenNotification
object:nil];
该方法使用self的属性:
- (void)moviePlayerWillEnterFullscreen:(NSNotification *)notification
{
NSLog(@"%@", self.videoItem._id);
}
有时(并非总是)处理程序中的self对象是一个不同的对象(以及导致崩溃的未初始化对象)
我似乎无法弄清楚我做错了什么,以及如何避免这种情况。
"self"
对象是否被复制?
答案 0 :(得分:4)
回应@ 0x7fffffff的评论,如果你注册观察,你几乎总是想要:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
从通知中心移除自己(通常)成本很低,并且不管你是否是观察者,所以这对于任何观察过通知的对象都是一个很好的保险。
(以观察者身份移除自己是中心注册观察总数的O(n)。因此,如果您有数千次通知观察,那么removeObserver:
可能会花费大量时间,但postNotification:
也会如此1}}。在这种情况下,您通常应该减少观察的次数,而不是避免使用removeObserver:
。)
跟进您的评论,您几乎不想在addObserver:
中使用viewDidLoad
。您几乎总是希望在viewDidAppear:
中执行此操作,并在viewWillDisappear:
(或viewWillAppear:
/ viewDidDisappear:
(以方便者为准)中以及{{1}中以观察者身份移除自己作为安全。在当前不在屏幕上的视图控制器中观察通知几乎总是不正确的。