2016-02-24 77 views
2

我剛剛閱讀了ARC section in the Swift book以及其他一些涉及weakunowned的文章。爲什麼存在薄弱和無主權?爲什麼我們不能總是使用弱?

讀完之後,我對他們是什麼以及他們每個人在什麼情況下都有了清楚的瞭解(另請參閱this SO post,它對此有很好的解釋)。

但是,我不明白爲什麼蘋果甚至想出了這兩個解決方案?從本質上講,從MM的角度來看,這兩者都沒有創造出對被引用對象的強烈引用(即不增加其retainCount)。那麼,爲什麼還要在這裏打擾並提供兩個MM原語?

現在,開發者需要了解何時使用哪兩種,蘋果在解釋不同的場景方面做得很好,但他們並沒有說爲什麼。例如,它不是很簡單嗎? 只有提供weak以便開發人員不需要深入瞭解文檔並理解不同的用例?

我想,另一種解釋問題的方法是,爲什麼我們應該使用unowned,除了蘋果告訴我們這樣?至少從MM的角度來看,這不會產生影響,並根據文檔使用weak,我們應該使用unowned不會造成內存泄漏?!

+0

是你的問題「爲什麼蘋果甚至想出了這兩個解決方案?」如果是這樣,這個問題主要是基於意見的,因爲只有蘋果員工可以回答爲什麼構建這樣的語言。 – JAL

+0

@JAL啊不,對不起,我想我的問題並不是100%清楚。蘋果公司的文檔似乎表明,除了他們推薦何時使用哪個軟件之外,「弱」和「無主」之間並沒有區別。從MM的角度來看,它們似乎完全可以互換。他們並沒有明確指出,在某些情況下,編譯器會實際上抱怨一個,但接受另一個,所以我想知道這些建議來自哪裏。 – nburk

回答

3

區別在於變量的可選性。像蘋果在鏈接的無主參考部分說,你提供:

與弱引用,但是,無主的基準假設爲 總是有一個值。正因爲如此,一個無主的參考始終是定義爲非選擇性類型的 。

這在閉包區塊中的使用更爲明顯。在這裏你不必使用?如果你在閉包裏面使用它,你可以獲得對象的引用。

而不是寫這個的:

UIView.animateWithDuration(0.2) { 
    [weak self] 
    () -> Void in 
    self?.view.layoutIfNeeded() 
} 

但是,如果你能肯定的是,參考自身不會動畫之前被釋放,並可以簡單的寫無主,並沒有用?運算符或使用if let語句打開它:

UIView.animateWithDuration(0.2) { 
    [unowned self] 
    () -> Void in 
    self.view.layoutIfNeeded() 
} 
+0

我非常肯定在你的最後一句話中,你的意思是「IFF你可以確定自我的引用不會在動畫之前被釋放,你可以簡單地寫出無主的..」。如果在執行閉包之前釋放'self',你將訪問一個懸掛指針並且程序會崩潰。 – CouchDeveloper

+1

是的,你是對的,我的意思是寫它,並將修復它:) –

3

@Kádi關於弱變量是可選的答案是正確的,但不完整。

弱和無主在Swift的可選語義之外的含義有所不同。弱參考更準確地命名爲自動調零弱參考。系統知道存儲在弱變量中的對象,並且當對象被釋放時,轉到額外的工作來清零該值。作爲的後果,弱變量是Swift中的可選項。

無主指針根本沒有內存管理。它們是一個可以取任何值的原始內存指針。 (它們仍然可以被鍵入以指向特定類型的結構,所以它們並不總是「原始」的,因爲C void指針是未加工的。)無主指針可用於指向malloc的內存,指針算術等。將一個指針類型聲明爲unowned,基本上告訴編譯器「不要擔心,我知道我在做什麼。」在你嘗試解引用它之前,你必須確保指針總是有效的,並且還要管理指針背後的內存。

相關問題