swift unowned和weak的使用

通常的解釋是剩盒,考慮到對(duì)象的生命周期纵竖,您應(yīng)該在unowned和weak之間進(jìn)行選擇肩杈,但有時(shí)您可能仍然懷疑應(yīng)該實(shí)際使用哪一個(gè)墓造,并且想知道unowned和weak哪一個(gè)更好堪伍。

眾所周知,Swift利用良好的舊ARC(自動(dòng)引用計(jì)數(shù))來管理內(nèi)存觅闽,因此帝雇,正如我們習(xí)慣使用Objective-C一樣,我們必須通過明智地使用弱手動(dòng)處理保留周期引用蛉拙。

如果您不熟悉ARC尸闸,則只需要知道每個(gè)引用類型實(shí)例都將具有與之關(guān)聯(lián)的引用計(jì)數(shù)(簡單整數(shù)值),這將用于保持對(duì)象實(shí)例當(dāng)前的次數(shù)計(jì)數(shù)由變量或常數(shù)引用。一旦該計(jì)數(shù)器達(dá)到零吮廉,就會(huì)釋放實(shí)例苞尝,并且它們所擁有的內(nèi)存和資源將再次可用。

每當(dāng)兩個(gè)實(shí)例以某種方式相互引用時(shí)宦芦,您就有一個(gè)保留周期(例如宙址,兩個(gè)類實(shí)例具有引用另一個(gè)類實(shí)例的屬性,如同雙鏈表中的兩個(gè)相鄰節(jié)點(diǎn)實(shí)例一樣)會(huì)阻止這些實(shí)例被釋放调卑,因?yàn)楸A粲?jì)數(shù)總是大于零的值抡砂。

為了解決這個(gè)問題,在Swift中以及在許多其他語言中恬涧,引入了弱引用的概念舀患,ARC不考慮這些引用,因此不會(huì)增加對(duì)象的保留計(jì)數(shù)气破。

考慮到弱引用不會(huì)阻止實(shí)例被釋放,因此必須始終記住餐抢,弱引用在任何時(shí)候都不能再指向有效對(duì)象现使。

Swift有兩種弱引用:unowned和weak。

雖然它們用于相同的目的旷痕,但它們與您的實(shí)例生命周期相關(guān)的假設(shè)略有不同碳锈,并且具有不同的性能特征。

在Objective-C中欺抗,遵循標(biāo)準(zhǔn)模式售碳,您將在塊外聲明對(duì)該實(shí)例的弱引用,然后在塊內(nèi)聲明對(duì)該實(shí)例的強(qiáng)引用绞呈,以便在塊執(zhí)行期間獲取它贸人。顯然,檢查引用是否仍然有效是必要的佃声。

為了幫助處理保留周期艺智,Swift引入了一個(gè)新的構(gòu)造來簡化并更明確地捕獲閉包內(nèi)的外部變量,即捕獲列表圾亏。使用捕獲列表十拣,您可以在函數(shù)頂部聲明將用于指定應(yīng)在內(nèi)部創(chuàng)建哪種引用的外部變量。

1.當(dāng)您不使用捕獲列表時(shí)志鹃,閉包將創(chuàng)建對(duì)外部作用域的值的強(qiáng)引用:


閉包內(nèi)發(fā)生的修改將改變原始變量的值

2.使用捕獲列表夭问,創(chuàng)建一個(gè)在閉包范圍內(nèi)有效的新常量。

如果未指定捕獲修飾符曹铃,則常量只是原始值的副本缰趋,適用于值類型和引用類型。

在上面的例子中,我們iCopy在調(diào)用之前聲明函數(shù)iStrong埠胖,并且當(dāng)聲明函數(shù)初始化私有常量時(shí)糠溜。如您所見,當(dāng)我們調(diào)用第二個(gè)函數(shù)時(shí)直撤,我們?nèi)匀粫?huì)打印原始值i1非竿。

3.指定具有引用類型的外部變量的名稱之前weak或unowned之前,此常量將被初始化為對(duì)原始值的弱引用谋竖,并且這種特定形式的捕獲是我們用來中斷保留周期的形式红柱。


使用unowned時(shí)?永遠(yuǎn)不會(huì)為nil 使用weak時(shí) 則是可選值

所以 如果這些對(duì)象的生命周期互不相關(guān),也就是說蓖乘,你不能保證哪一 個(gè)對(duì)象存在的時(shí)間會(huì)比另一個(gè)?锤悄,那么弱引用就是唯一的選擇。另一種情況下嘉抒,如果你可以保證非強(qiáng)引用對(duì)象擁有和強(qiáng)引用對(duì)象同樣或者更?的生命周期的話零聚,unowned?引用通常會(huì)更方便一些。這是因?yàn)槲覀兛梢圆恍枰幚砜蛇x值些侍,而且變量將可以被

let?聲明隶症,而與之相對(duì),弱引用必須被聲明為可選的?var岗宣。同樣的生命周期是很常?的蚂会,特別是當(dāng) 兩個(gè)物體擁有主從關(guān)系的時(shí)候。當(dāng)主對(duì)象通過強(qiáng)引用控制子對(duì)象的生命周期耗式,而且你可以確定 沒有其他對(duì)象知道這個(gè)子對(duì)象的存在時(shí)胁住,子對(duì)象對(duì)主對(duì)象的逆向引用就可以是?unowned?引用。

unowned?引用要比?weak?引用少一些性能損耗刊咳,因此訪問一個(gè)?unowned?引用的屬性或者調(diào)用 它上面的方法都會(huì)稍微快一些;不過彪见,這個(gè)因素應(yīng)該只在性能非常重要的代碼路徑上才需要被 考慮。

unowned?引用帶來的不好的地方當(dāng)然是如果你在生命周期的假設(shè)上犯了錯(cuò)娱挨,那么你的程序就將 崩潰企巢。個(gè)人來說,我經(jīng)常會(huì)在?unowned?也可以使用的情況下让蕾,還是去選擇用?weak浪规。weak?將強(qiáng)制我們在所有使用的地方都去檢查引用是否依然有效。我們可能會(huì)時(shí)不時(shí)地對(duì)一些 代碼進(jìn)行重構(gòu)探孝,而這可能會(huì)導(dǎo)致我們之前對(duì)于對(duì)象生命周期的假設(shè)失效笋婿。看你對(duì)哪一方面更重視

---------------------

作者:一如初夏丿

原文:https://blog.csdn.net/weiwandaixu_/article/details/83026208?utm_source=copy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顿颅,一起剝皮案震驚了整個(gè)濱河市缸濒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖庇配,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斩跌,死亡現(xiàn)場離奇詭異,居然都是意外死亡捞慌,警方通過查閱死者的電腦和手機(jī)耀鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啸澡,“玉大人袖订,你說我怎么就攤上這事⌒崧玻” “怎么了洛姑?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長皮服。 經(jīng)常有香客問我楞艾,道長,這世上最難降的妖魔是什么龄广? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任硫眯,我火速辦了婚禮,結(jié)果婚禮上蜀细,老公的妹妹穿的比我還像新娘。我一直安慰自己戈盈,他們只是感情好奠衔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塘娶,像睡著了一般归斤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刁岸,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天脏里,我揣著相機(jī)與錄音,去河邊找鬼虹曙。 笑死迫横,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酝碳。 我是一名探鬼主播矾踱,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疏哗!你這毒婦竟也來了呛讲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贝搁,沒想到半個(gè)月后吗氏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷逆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年弦讽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片关面。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坦袍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出等太,到底是詐尸還是另有隱情捂齐,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布缩抡,位于F島的核電站奠宜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞻想。R本人自食惡果不足惜压真,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蘑险。 院中可真熱鬧滴肿,春花似錦、人聲如沸佃迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵俏。三九已至堆缘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間普碎,已是汗流浹背吼肥。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻车,地道東北人缀皱。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像动猬,于是被迫代替她去往敵國和親唆鸡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355