3 回答

TA貢獻1795條經(jīng)驗 獲得超7個贊
您需要將協(xié)議類型聲明為class。
protocol ProtocolNameDelegate: class {
// Protocol stuff goes here
}
class SomeClass {
weak var delegate: ProtocolNameDelegate?
}
我的理解是,使用class,您可以確保僅在類上使用此協(xié)議,而不會在枚舉或結(jié)構(gòu)之類的其他東西上使用。

TA貢獻1871條經(jīng)驗 獲得超13個贊
補充答案
我一直對代表是否應(yīng)該軟弱感到困惑。最近,我了解了有關(guān)委托的詳細信息以及何時使用弱引用,因此為了將來的讀者,讓我在此處添加一些補充要點。
使用weak關(guān)鍵字的目的是避免強參考循環(huán)(保留循環(huán))。當兩個類實例相互具有強引用時,就會發(fā)生強引用循環(huán)。他們的參考計數(shù)永遠不會為零,所以他們永遠不會被釋放。
weak如果委托是一個類,則僅需要使用。Swift結(jié)構(gòu)和枚舉是值類型(在創(chuàng)建新實例時會復制它們的值),而不是引用類型,因此它們不會構(gòu)成強引用周期。
weak引用始終是可選的(否則,您將使用unowned),并且始終使用var(非let),以便可以在nil取消分配可選項時將其設(shè)置為。
父類自然應(yīng)該對其子類有強烈的引用,因此不要使用weak關(guān)鍵字。但是,當孩子想要引用其父母時,應(yīng)通過使用weak關(guān)鍵字使其成為弱引用。
weak當您想要引用一個您不擁有的類時,應(yīng)該使用,而不是僅用于引用其父類的孩子。當兩個非層次類需要相互引用時,請選擇一個弱類。您選擇的一種取決于情況。有關(guān)更多信息,請參見此問題的答案。
通常,應(yīng)將委托人標記為,weak因為大多數(shù)委托人都在引用他們不擁有的類。當孩子使用委托與父母溝通時,這絕對是正確的。文檔建議使用弱引用作為委托。(但是看這個,太)。
協(xié)議可用于引用類型(類)和值類型(結(jié)構(gòu),枚舉)。因此,在可能需要弱化委托的情況下,必須使其成為僅對象協(xié)議。做到這一點的方法是添加AnyObject到協(xié)議的繼承列表中。(過去您是使用class關(guān)鍵字來完成此操作的,但AnyObject現(xiàn)在是首選。)
protocol MyClassDelegate: AnyObject {
// ...
}
class SomeClass {
weak var delegate: MyClassDelegate?
}
進一步研究
閱讀以下文章有助于我更好地理解這一點。他們還討論了相關(guān)問題,例如unowned關(guān)鍵字和閉包發(fā)生的強大參考周期。
- 3 回答
- 0 關(guān)注
- 631 瀏覽
添加回答
舉報