weak引用和unowned引用有些類似但不完全相同萍嬉。Unowned 引用芽偏,像weak引用一樣,不會(huì)增加對(duì)象的引用計(jì)數(shù)名眉。然而粟矿,在Swift里,一個(gè)unowned引用有著非可選類型的優(yōu)點(diǎn)损拢。這樣相比于借助和使用optional binding更易于管理陌粹。
此外,unowned引用是non-zeroing(非零的) ,這表示著當(dāng)一個(gè)對(duì)象被銷(xiāo)毀時(shí)福压,它指引的對(duì)象不會(huì)清零申屹。也就是說(shuō)使用unowned引用在某些情況下可能導(dǎo)致dangling pointers(野指針url)。
在引用對(duì)象的生命周期內(nèi)隧膏,如果它可能為nil哗讥,那么就用weak引用。反之胞枕,當(dāng)你知道引用對(duì)象在初始化后永遠(yuǎn)都不會(huì)為nil就用unowned杆煞。
如果你知道你引用的對(duì)象會(huì)在正確的時(shí)機(jī)釋放掉,且它們是相互依存的,而你不想寫(xiě)一些多余的代碼來(lái)清空你的引用指針决乎,那么你就應(yīng)該使用unowned引用而不是weak引用队询。
像下面這種懶加載在閉包中使用self就是一個(gè)使用unowned的很好例子:
我們需要用unowned self 來(lái)避免引用循環(huán)。Kraken 和 businessCardName在它們的生命周期內(nèi)都相互持有對(duì)方构诚。它們相互持有蚌斩,因此總是被同時(shí)銷(xiāo)毀,滿足使用unowned 的條件范嘱。如果去掉[unowned self] 不會(huì)執(zhí)行deinit方法送膳。
然而,不要把下面的懶加載變量與閉包混淆:
在懶加載變量中調(diào)用closure時(shí)丑蛤,由于沒(méi)有retain closure叠聋,所以不需要加 unowned self。變量只是簡(jiǎn)單的把閉包的結(jié)果assign 給了自己受裹,閉包在使用后就被立即銷(xiāo)毀了碌补。