我正在开发的应用程序有很多视觉格式的限制。在一次操作中集中一些网络请求后,我开始遇到 EXC_BAD_ACCESS 崩溃。如果我通过 NSLayoutConstraint(item....) 初始值设定项手动创建约束,则不会发生任何崩溃。
这是我的代码中发生崩溃的行:
什么可能导致这次崩溃?以及如何修复它?
最佳答案
在创建 NSLayoutConstraints 数组然后从数组中一次性激活所有内容时,我遇到了同样的问题。
当您导航离开某个 View 然后返回该 View 时,有时该 View 可能会分配给不同的内存分配并导致错误访问错误。
事情是这样的。每次 View 加载时,新的约束都会添加到数组中(假设您添加它们并从 .viewDidLoad()
函数或每次 View 再次可见时加载的类似函数激活它们)。
当您离开数组时,数组不会自行清空,因此旧的约束也保留在数组中。当您导航回 View 并尝试激活约束时,系统会尝试再次激活旧约束(它们引用的内存不再包含约束所引用的任何 View )。
要解决此问题,请在向数组添加新约束之前对数组调用 .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)
}
希望这有帮助!
关于ios - NSLayoutConstraint VFL 由于 EXC_BAD_ACCESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244582/