![](/img/trans.png)
[英]How do you create a base class with a weak delegate that conforms to a generic protocol?
[英]weak Delegate and class protocol
在調用dismissViewControll之后,我一直在使用protocol和delegate方法將數據傳回給前一個VC。 以下是我通常會這樣做的原因,因為大多數教程都不是這樣寫的
protocol someVCDelegate {
func somefunction()
}
var delegate: someVCDelegate!
但是,我遇到了寫這種類/弱方法。
protocol someVCDelegate : class {
func somefunction()
}
weak var delegate: someVCDelegate!
我知道弱與ARC有關並且避免了保留周期。 但是,我不確定何時需要它,因為在我的所有情況下,沒有做弱代理工作查找(VC確實deinit)。 在什么樣的情況下我需要弱代表? 另外,為什么它是“!” 弱,通常是“?” 弱者之后?
你說:
但是,我不確定在所有情況下我什么時候都需要它,而不是做弱委托工作
當您有可能進行強參考循環時,您只需要弱的協議委托模式,即一系列強引用循環。 例如,考慮:
具有屬性(“子”)的對象(“父”),即父對子具有強引用;
孩子有delegate
財產; 和
您將子delegate
設置為引用父對象。
在這種情況下,代表是weak
引用至關重要,否則你將有一個強大的參考周期。
注意,這是一個簡單的例子,有時強引用鏈可能相當復雜。 例如,考慮具有委托屬性的UIView
子類。 潛在的強引用周期可能很長,從視圖控制器到其根view
,通過子視圖的一系列子視圖,一直到具有可能可能引用回視圖控制器的delegate
的UIView
。 這也將導致強大的參考周期,並且由於這個原因,我們傾向於為該delegate
使用weak
引用。
但是,當您使用協議委托模式在視圖控制器之間傳遞數據時,這通常不是問題(視圖控制器包含除外),因為呈現視圖控制器不擁有呈現的視圖控制器。 視圖控制器層次結構通常維護對視圖控制器的強引用。 因此,當您關閉所呈現的視圖控制器時,它將被解除分配,並且可以解決潛在的強參考周期。
通常,我們會本能地使用weak
協議委托模式(僅僅因為它可以防止強引用循環發生)。 但有時您會使用強引用。 最常見的強引用模式是NSURLSession
其delegate
是一個強引用。 正如init(configuration:delegate:delegateQueue:)
的文檔警告我們:
會話對象保留對
delegate
的強引用,直到您的應用退出或顯式使會話無效。 如果您沒有通過調用invalidateAndCancel()
或finishTasksAndInvalidate()
方法使會話invalidateAndCancel()
,則您的應用程序會泄漏內存,直到它退出。
雖然這可能看似矛盾,但這種強大的參考模式的優點是會話知道它可以安全地調用其委托方法而不必擔心對象已被解除分配。 ( NSURLSession
, NSURLSession
這種強大的委托行為很少會讓它變得丑陋,因為我們經常使用完成處理程序方法而根本不使用委托方法,而當我們使用委托方法時,我們經常會有一些其他對象而不是視圖控制器作為會話的委托。)
簡而言之,你真的必須評估每種情況,並確定我們本能地傾向於弱的參考是否更好,或者你是否有其中一種情況,你的協議更好地服務於強引用。
為什么它很弱:弱引用是一個引用,它不會強制保留它引用的實例,因此不會阻止ARC處理引用的實例。 此行為會阻止引用成為強引用循環的一部分。 或者簡單地說,您可以通過將類之間的某些關系定義為弱引用或無引用而不是強引用來解析強引用循環。
它是“!” 在弱之后因為它被隱含地打開了。 它會有價值。
有時從程序的結構中可以清楚地看出,在首次設置該值之后,可選項將始終具有值。 在這些情況下,每次訪問時都不需要檢查和解包可選的值,因為可以安全地假設它始終具有值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.