[英]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.