NotificationCenter:Notification postet时的BAD_ACCESS

时间:2017-08-22 08:03:07

标签: ios swift exc-bad-access nsnotificationcenter

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

(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) 出现时,计算结束并触发通知:

(A)

但这会导致

  

主题1:EXC_BAD_ACCESS

我确定通知是问题,因为我拼错了通知名称,然后没有发生崩溃。此外,(B)public class Country { @SerializedName("id") @Expose private Integer id; @SerializedName("name") @Expose private String name; @SerializedName("pager") @Expose private Pager pager; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Pager getPager() { return pager; } public void setPager(Pager pager) { this.pager = pager; } } 仍然没有被释放,因为它们正在堆叠中。我在Profiler中找不到任何Zombie。

知道可能是什么问题吗?

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

2 个答案:

答案 0 :(得分:3)

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

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

我试图用我的选择器调用一个父亲的函数来处理我正在注册通知的子类。我必须在子类上创建一个辅助函数并调用父函数。

如果在重新加载时有一个可选参数和/或重载是父类中的一个函数,请尝试创建一个调用reload的辅助函数,并使选择器指向该函数。

答案 1 :(得分:1)

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