NotificationCenter:BAD_ACCESS 当通知发布者

NotificationCenter: BAD_ACCESS when Notification postet

我有一个带有 3 个视图控制器的应用程序,它们被推送到导航控制器堆栈上。

(A) -> (B) -> (C)

(A)viewWillAppear 中注册通知:

NotificationCenter.default.addObserver(self, selector: #selector(reload), name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil)

(A) 在 viewWillDisappear:

中注销
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil)

另外 (A)deinit() 中注销,但这从未被调用。

现在 (B) 被压入堆栈并注册/注销与 (A) 相同的事件。

现在 (C) 被推入堆栈触发计算并弹回 (B)。一段时间后,当 (B) 出现时,计算完成并触发通知:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil)

但这会导致

Thread 1: EXC_BAD_ACCESS

我确定是通知出了问题,因为我拼错了通知名称,但没有发生崩溃。 (A)(B) 仍然没有被释放,因为它们在堆栈中。我在 Profiler 中找不到任何僵尸。

知道可能是什么问题吗?

我正在使用 XCode 9beta6 和 Swift 4.

您正在使用名称 "BACKEND_DATA_CHANGED" 注册通知并取消注册 "DATA_CHANGED"。它们是不同的通知。

所以我只花了大约 4 个小时在我自己的代码中修复这个问题。这是我的问题:

我在选择器中指定的函数有一个默认值为 nil 的可选参数。然后我的选择器看起来就像你的一样——没有参数列表。但是,当我发出通知时,我收到 EXC_BAD_ACCESS。

我试图用我的选择器调用 parent 的函数,与我在其上注册通知的 child class 相关。我必须在 child class 上创建一个辅助函数并调用 parent 的函数。

如果您在 reload 中有一个可选参数 and/or reload 是 parent class 中的一个函数,请尝试制作一个调用 reload 的辅助函数并使您的选择器指向该函数.