2017-09-13 125 views
0

說我要刪除一個約束,傳統上,我會做:設置`constraint.isActive = false`是否解除約束?

view.removeConstraint(constraint) 

然而,現在有用於安裝/卸載限制新的isActive方法。

如果我做到以下幾點:

constraint.isActive = false 

將它從內存中正確刪除呢?

+0

爲什麼關注?當然,這個約束不再是* active *。但這聽起來像你關心的是記憶?爲什麼? – dfd

+0

如果它實際上沒有從內存中釋放它,並且我不斷地安裝/刪除約束,它會越來越消耗設備的內存。我們通常希望對象在不再使用時被釋放。 – Senseful

+0

我認爲你錯了。約束是視圖的一部分。您釋放視圖,釋放約束。 (順便說一下,爲什麼不使用ARC?)您不安裝/刪除*約束,您*激活/停用*它們。我認爲這是對編碼策略的一種調整,但是我們再一次不再在大型機具有64K核心內存的石器時代工作,我們正在談論iOS/macOS設備(越來越多使用Swift和ARC代替Obj -C和手動內存分配和釋放)使用數百GB的設備。 – dfd

回答

0

是,

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) 
+0

並不意味着*所有*引用將刪除問題中所述,只意味着視圖不保留約束了,其他參考文獻不受此行爲的影響 –

+0

@MertBuran好點。我更新了問題標題以反映我真正想知道的內容。 – Senseful