Does setting `constraint.isActive = false` deallocate the constraint?

Sen*_*ful 4 uiview nslayoutconstraint swift

假设我要删除约束,传统上我会这样做:

view.removeConstraint(constraint)
Run Code Online (Sandbox Code Playgroud)

但是,现在有了用于安装/卸载约束的新的isActive方法。

如果我执行以下操作:

constraint.isActive = false
Run Code Online (Sandbox Code Playgroud)

它会正确地将其从内存中删除吗?

Sen*_*ful 5

是,

constraint.isActive = false
Run Code Online (Sandbox Code Playgroud)

在做与以下事情相同的事情:

viewThatOwnsConstraint.removeConstraint(constraint)
Run Code Online (Sandbox Code Playgroud)

因此,如果唯一约束该约束的是视图,那么它将正确地将其从内存中删除。


这是证明:

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)
Run Code Online (Sandbox Code Playgroud)