[英]Why are the outlets by default declared as weak?
我在谷歌上查了這個話題,但還沒有得到一個可以理解的答案,問題是我知道當兩個類通過從第二個類中實例化第一個類中的一個對象並在第二個類中聲明另一個對象來耦合在一起時第一個類這將導致一個保留循環,應該通過使用關鍵字 weak 或 unowned 來打破,但我不能將這種思維方式應用於被聲明為弱的 IBOutlets
class SignUpViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet weak var signUpBttn: UIButton!
}
這是我的 viewController 類中的插座,為什么插座被聲明為 weak ? 根據我的理解,要有一個保留周期,uibutton 類應該有一個來自 viewController 類的對象,以便這兩個類(viewController 和 uibutton)耦合在一起有人可以澄清幕后發生的事情嗎?
視圖控制器中的所有 ui 元素都是 viewController 視圖的一部分。 所以視圖是一個 UIView 類,並且出口在 viewController 中引用到 UIView 類元素,所以如果從視圖層次結構中刪除視圖,所有交叉元素都應該是弱的,以避免交叉引用。 關於這個的問題是來自蘋果 MVC 的參考,其中 ViewController 是一個控制器,但有一堆視圖部分的相關代碼。 你所有的插座都應該放在你的 ViewController 的 UIView 類中。
TLDR - 在我看來,這不是一個好的決定。
strong
引用表示所有權。 視圖或視圖控制器是視圖的所有者,因此邏輯選擇應該strong
。
然而,在大多數情況下,這並不重要,因為視圖在視圖層次結構中也被其父級強烈引用。
什么時候重要? 當您通過刪除視圖/約束等動態更新視圖層次結構時,這很重要。一旦您從層次結構中刪除視圖/約束並且您沒有對它的強引用,它將從內存中刪除。
還要注意weak
和的組合!
有點危險,因為!
表示您希望永遠不會為nil
的引用。
這可能會導致錯誤,例如:
@IBOutlet weak var constraint: NSLayoutConstraint!
...
constraint.isActive = false // removes constraint from hierarchy, assigns `nil` to constraint
...
constraint.isActive = true // crashes the app
就個人而言,我總是使網點strong
。 對於我總是使用的任何weak
引用?
而不是!
.
請注意,在這種情況下, weak
與防止引用循環無關。 這只是 Xcode 開發人員的個人決定。
從歷史上看,可能與UIViewController.viewDidUnload
有聯系。 但是,從 iOS 6 開始就不再調用該方法。
Apple 建議將@IBOutlet
聲明為strong 。 可以找到許多關於此的討論/文章。
如果您看一下 Apple 2015 WWDC 的這段視頻,就在 32:30 左右: https : //developer.apple.com/videos/play/wwdc2015/407/
他說:
一般來說,你應該讓你的插座強大,尤其是當你將插座連接到子視圖或約束時,視圖層次結構並不總是會保留。 您真正需要使插座變弱的唯一時間是,如果您有一個自定義視圖,該視圖引用了視圖層次結構中的某些內容,並且通常不推薦這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.