簡體   English   中英

為什么 Xcode 不讓網點無主而不是弱點?

[英]Why doesn't Xcode make outlets unowned instead of weak?

Xcode 將出口生成為具有隱式解包的弱變量,如下所示:

@IBOutlet weak var nameTextField: UITextField!

我想知道為什么它不只是使onowned var ,在我的理解中 - 行為完全相同,但保持類型非可選。 這兩者有什么區別嗎?

weak var foo: UITextField!
unowned var foo: UITextField

weak變量有一個默認值,即nil ,所以你的代碼是合法的,因為 outlet 屬性在對象創建時(實際連接 outlet之前)有一個值。

但是unowned變量將沒有默認值,您的代碼將無法編譯。 試試吧。

整個概念也是錯誤的。 unowned是一個有保證的獨立存在的東西,你不能沒有它。 視圖控制器視圖的子視圖不滿足這兩個條件。

是的,有區別。 除了默認值問題,還有一種方法可以檢查weak值當前是否存在:

if let nameTextField = nameTextField {
    // do smth
}

另一方面,我認為沒有辦法檢查unowned是否存在並且可以訪問。 每當使用unowned ,它應該總是在那里,這在IBOutlet的情況下並非如此。 在從故事板加載視圖控制器之前,不會設置插座。

希望這有幫助!

無主類型是危險的,最好避免。 無主變量等同於 Objective C 的 unsafe_unretained 類型。

如果無主引用指向的對象被釋放,則無主引用不會被設置為 nil。 如果您稍后嘗試引用該對象,您的代碼將無法判斷它是否仍然有效。 如果您嘗試調用方法或讀/寫實例變量,如果對象已被釋放,您可能會崩潰。

(然后事實是變量沒有默認值,正如馬特在他的回答中所說。)

unowned var foo: UITextField應該在視圖控制器初始化期間初始化,但這是不可能的,因為只有在創建視圖之后才能初始化 outlet,並且只有在顯示視圖控制器時才創建視圖(更准確地說是在訪問view屬性時)。

過去,選項不能是unowned 現在這是可能的,所以unowned是合適的。 這可能不會自動完成,因為它會使某些人感到困惑。

@IBOutlet private unowned var uiObject: UIObject!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM