由于EXC_BAD_ACCESS

时间:2016-10-25 15:59:42

标签: ios swift dictionary uikit nslayoutconstraint

我正在处理的应用程序有很多视觉格式的约束。在我在一次操作中捆绑了一些网络请求后,我开始得到EXC_BAD_ACCESS崩溃。如果我通过NSLayoutConstraint(item ....)初始化程序手动创建约束,我不会遇到任何崩溃。

以下是我的代码中发生崩溃的行:

enter image description here

这是崩溃日志: enter image description here

什么可能导致这次崩溃?我该如何解决?

1 个答案:

答案 0 :(得分:0)

在创建NSLayoutConstraints数组时,我遇到了同样的问题,然后从数组中一次激活所有内容。

当您导航到远离视图然后返回到它时,有时可以将视图分配给不同的内存分配并导致错误访问错误。

这是发生了什么。每次加载视图时都会向数组添加新约束(假设您添加它们并从.viewDidLoad()函数或从每次视图再次可见时加载的类似函数激活它们)。

当您离开数组时,数组不会自行清空,因此旧约束也会保留在数组中。当您导航回视图并尝试激活约束时,系统会再次尝试激活旧约束(这些约束引用的内存不包含您的约束引用的任何视图)。

要解决此问题,请在向阵列添加新约束之前调用阵列上的.RemoveAll()。这将确保删除所有旧约束,系统不会尝试激活它们。

这是一个例子。

var initialConstraints = [NSLayoutConstraint]()

    override func viewDidLoad() {
    super.viewDidLoad()

    // Empty the array once the view loads
    initialConstraints.removeAll()

    // Add your constraints like normal
    initialConstraints.append(...)

    // Activate your constraints once you've added them to the array (like normal)
    NSLayoutConstraint.activate(initialConstraints)

}

希望这有帮助!