gpt4 book ai didi

ios - addObserver 中的对象不同

转载 作者:行者123 更新时间:2023-12-01 18:12:13 25 4
gpt4 key购买 nike

我有以下代码:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreen:)
name:MPMoviePlayerWillEnterFullscreenNotification
object:nil];

并且该方法使用了 self 的一个属性:
- (void)moviePlayerWillEnterFullscreen:(NSNotification *)notification
{
NSLog(@"%@", self.videoItem._id);
}

有时(并非总是)处理程序中的 self 对象是一个不同的对象(并且是一个导致崩溃的未初始化对象)

我似乎无法弄清楚我做错了什么,以及如何避免这种情况。
"self"对象被复制?

最佳答案

呼应@0x7fffffff 的评论,如果您注册观察,您几乎总是希望拥有:

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

将自己从通知中心移除(通常)几乎没有成本,而且它并不关心您是否是观察者,所以这是我建议任何观察到通知的对象的良好保险。

(将自己作为观察者移除在中心的注册观察总数中是 O(n)。因此,如果您有数千个通知观察,那么 removeObserver: 可能会花费大量时间,但 postNotification: 也会如此。在这种情况下,您通常应该减少观察次数,而不是避免使用 removeObserver:。)

跟进您的评论,您几乎不想使用 addObserver:viewDidLoad .您几乎总是想在 viewDidAppear: 中进行操作并在 viewWillDisappear: 中删除自己作为观察者的身份(或 viewWillAppear:/ viewDidDisappear: ,以方便为准),以及 dealloc作为安全。在当前不在屏幕上的 View Controller 中观察通知几乎总是不正确的。

关于ios - addObserver 中的对象不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28486784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com