说我要删除一个约束,传统上,我会做:设置`constraint.isActive = false`是否解除约束?
view.removeConstraint(constraint)
然而,现在有用于安装/卸载限制新的isActive方法。
如果我做到以下几点:
constraint.isActive = false
将它从内存中正确删除呢?
说我要删除一个约束,传统上,我会做:设置`constraint.isActive = false`是否解除约束?
view.removeConstraint(constraint)
然而,现在有用于安装/卸载限制新的isActive方法。
如果我做到以下几点:
constraint.isActive = false
将它从内存中正确删除呢?
是,
constraint.isActive = false
在做同样的事情:
viewThatOwnsConstraint.removeConstraint(constraint)
因此,如果持有到约束的唯一的事情就是看,那么这将正确地从内存中删除。
这里的证明:
let view = UIView()
weak var weakView: UIView? = nil
autoreleasepool {
weakView = UIView()
}
assert(weakView == nil)
// Traditional way of removing constraints ensures that the constraint is deallocated
weak var weakConstraint: NSLayoutConstraint? = nil
autoreleasepool {
weakConstraint = view.widthAnchor.constraint(equalToConstant: 10)
}
assert(weakConstraint == nil) // nothing is holding on to the constraint
autoreleasepool {
weakConstraint = view.widthAnchor.constraint(equalToConstant: 10)
view.addConstraint(weakConstraint!)
}
assert(weakConstraint != nil)
autoreleasepool {
view.removeConstraint(weakConstraint!)
}
assert(weakConstraint == nil)
// New way of removing constraints:
assert(weakConstraint == nil)
autoreleasepool {
weakConstraint = view.widthAnchor.constraint(equalToConstant: 10)
weakConstraint!.isActive = true
}
assert(weakConstraint != nil)
autoreleasepool {
weakConstraint!.isActive = false
}
assert(weakConstraint == nil)
并不意味着*所有*引用将删除问题中所述,只意味着视图不保留约束了,其他参考文献不受此行为的影响 –
@MertBuran好点。我更新了问题标题以反映我真正想知道的内容。 – Senseful
为什么关注?当然,这个约束不再是* active *。但这听起来像你关心的是记忆?为什么? – dfd
如果它实际上没有从内存中释放它,并且我不断地安装/删除约束,它会越来越消耗设备的内存。我们通常希望对象在不再使用时被释放。 – Senseful
我认为你错了。约束是视图的一部分。您释放视图,释放约束。 (顺便说一下,为什么不使用ARC?)您不安装/删除*约束,您*激活/停用*它们。我认为这是对编码策略的一种调整,但是我们再一次不再在大型机具有64K核心内存的石器时代工作,我们正在谈论iOS/macOS设备(越来越多使用Swift和ARC代替Obj -C和手动内存分配和释放)使用数百GB的设备。 – dfd