說我要刪除一個約束,傳統上,我會做:設置`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