2017-08-22 115 views
0

我有与被导航控制器压栈3个viewcontrollers应用程式BAD_ACCESS。通知中心:当通知postet

(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) 

但是这导致的

主题1:EXC_BAD_ACCESS

我敢肯定,通知是问题,因为我拼写错了通知名称,然后没有发生崩溃。由于生活在堆栈上,所以(A)(B)仍未被释放。我无法在Profiler中找到任何僵尸。

任何想法可能是什么问题?

我使用的XCode 9beta6和斯威夫特4.

+1

请编辑您的问题,以显示堆栈跟踪。 – Paulw11

+0

没有堆栈跟踪。我只将EXC_BAD_ACCESS作为红线。 – netshark1000

+1

设置异常断点以获取受影响的行,实际的异常原因和堆栈跟踪。选择器的签名很可能是错误的。 – vadian

回答

0

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

我在选择指定的函数曾与零的默认值的可选参数。我的选择器看起来就像你的 - 没有参数列表。但是,当我发布通知时,我得到了EXC_BAD_ACCESS。

我试图打电话给父母的功能与我有关的子类,我注册的通知选择。我必须在子类上做一个辅助函数并调用父类的函数。

如果你有一个可选的参数在重载和/或重装是在父类中的功能,请尝试将其称之为重载一个辅助功能,让您的选择点到。

1

您注册名称为“BACKEND_DATA_CHANGED”通知和注销“DATA_CHANGED”。他们是不同的通知。

+0

对不起 - 我简化了示例,并在那里发生了错误。现在它是正确的 – netshark1000

+0

即使名称正确,您是否也收到同样的错误? –