2017-07-22 88 views
1

Xcode的生產網點與隱含解纏弱瓦爾,就像這樣:爲什麼Xcode不讓商店無主而不是弱?

@IBOutlet weak var nameTextField: UITextField! 

我不知道爲什麼它不只是讓onowned var,其中 - 在我的理解 - 的行爲完全一致,但保持型非-可選的。這兩者有什麼區別嗎?

weak var foo: UITextField! 
unowned var foo: UITextField 
+1

2階段初始化。初始化後,插座被分配,因此它們必須是可選的。通常無論他們保持「弱」還是「強壯」,但「無主」都不正確。 – Sulthan

+0

@Sulthan我總是想知道爲什麼一個IBOutlet在兩次斷點處被擊中。所以我創建了一個項目,將一個標籤拖入viewController並在其上設置斷點。第一個斷點發生在'viewDidLoad'或'init'之前。如果我打印標籤,它會顯示它爲'nil'。第二次,我在斷點之後是'init'但仍然在'viewDidLoad'之前。這一次,如果我打印它,它顯示:'可選' – Honey

回答

6

一個weak變量的默認值,即nil,所以你的代碼是合法的,因爲出口酒店在創建對象的時候(之前出口實際連接)的值。

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

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

+0

我不認爲這是原因。插座被宣佈爲弱的原因是插座的容器視圖總是會有很強的參考。它不能是無主的,因爲無主無法用於Objc運行時。弱有沒有默認值無。 Outlet隱含地解開。因此訪問時應始終保持非零值。 –

+0

「,因爲無主無法用於Objc運行時」@MohammadSadiq它在Objective-C中是非ARC'weak'。 – matt

0

是的,有差異。除了默認值的問題,有一種方法來檢查weak值是否當前存在:

if let nameTextField = nameTextField { 
    // do smth 
} 

,另一方面,我不認爲有一種方法來檢查unowned有並有效訪問。每當使用unowned時,它應該始終在那裏,在IBOutlet的情況下不是這樣。直到從故事板加載視圖控制器之後才設置插口。

希望這會有所幫助!

1

無主的類型是危險的,最好避免。一個無主變量相當於Objective C unsafe_unretained類型。

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

(此外,還有一個事實,即變量沒有默認值,亞光他回答說。)

+0

隱式解包選項也會導致它崩潰。我的理解是Outlet是非主持人的好選擇,但由於Obc運行時無法使用無主,所以它被聲明爲弱,隱式地解包。 –

+0

確實,如果零,隱式解包選項會崩潰,但崩潰得到保證,立即顯而易見。對已發佈的對象的無主引用會導致未定義的行爲,並可能導致內存損壞,直到稍後纔會顯示出來。這些錯誤是令人討厭的,很難找到。 –

+0

不,網點不適合無人使用。您應該避免無主的引用,並儘可能使用較弱的引用。 –

1

unowned var foo: UITextField應視圖控制器初始化過程中被初始化,但它是不可能的,因爲出口可以只初始化在創建視圖後,僅在顯示視圖控制器時才創建視圖(更確切地說,當訪問view屬性時)。

+0

是的,我認爲這就是爲什麼它使用'weak'的原因。 「無主」在初始化方面與其他任何屬性一樣。所以他們需要做可選的「無主」功能,當我們有'弱'功能時,這沒什麼意義。 –

相關問題