我正在处理的应用程序有很多视觉格式的约束。在我在一次操作中捆绑了一些网络请求后,我开始得到EXC_BAD_ACCESS崩溃。如果我通过NSLayoutConstraint(item ....)初始化程序手动创建约束,我不会遇到任何崩溃。
以下是我的代码中发生崩溃的行:
什么可能导致这次崩溃?我该如何解决?
答案 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)
}
希望这有帮助!