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