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 的辅助函数并使您的选择器指向该函数.
我有一个带有 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 的辅助函数并使您的选择器指向该函数.