解決實(shí)例間的強(qiáng)引用環(huán)

最近在看Swift教程中的ARC部分,看到“解決實(shí)例間的強(qiáng)引用環(huán)”時(shí)镇匀,有些疑問(wèn),故做此記錄痊焊。

我們知道Swift采用ARC做內(nèi)存回收郑兴,高效的同時(shí)也會(huì)出現(xiàn)內(nèi)存泄漏的問(wèn)題犀斋,即實(shí)例間強(qiáng)引用。教程里給出了三種場(chǎng)景并給出了示例代碼情连。前兩種比較好理解叽粹,看的時(shí)候,我對(duì)第三種有些疑惑却舀。該場(chǎng)景是這樣的:兩個(gè)屬性都必須有值虫几,且初始化完成后不能為nil。這種場(chǎng)景下挽拔,則要一個(gè)類用無(wú)主引用屬性辆脸,另一個(gè)類用 隱式展開的可選屬性。我的疑惑是為什么要用隱式展開的可選屬性螃诅,為什么不能用普通類型的常量呢啡氢?OK,先看教程中的例子:

class Country {
    let name: String
    var capitalCity: City!
    init(name: String, capitalName: String) {
        self.name = name
        self.capitalCity = City(name: capitalName, country: self)
    }
}

class City {
    let name: String
    unowned let country: Country
    init(name: String, country: Country) {
        self.name = name
        self.country = country
    }
}

也就是术裸,var capitalCity: City! 能不能用 let capitalCity: City 代替倘是?看起來(lái)是可以的,挺滿足要求的:初始化后不能為nil袭艺。但是如果用 let capitalCity: City 會(huì)不滿足Swift的 兩段式構(gòu)造過(guò)程 :

階段1:
某個(gè)指定構(gòu)造器或便利構(gòu)造器被調(diào)用搀崭;
完成新實(shí)例內(nèi)存的分配,但此時(shí)內(nèi)存還沒(méi)有被初始化猾编;
指定構(gòu)造器確保其所在類引入的所有存儲(chǔ)型屬性都已賦初值瘤睹。存儲(chǔ)型屬性所屬的內(nèi)存完成初始化;
指定構(gòu)造器將調(diào)用父類的構(gòu)造器答倡,完成父類屬性的初始化轰传;
這個(gè)調(diào)用父類構(gòu)造器的過(guò)程沿著構(gòu)造器鏈一直往上執(zhí)行,直到到達(dá)構(gòu)造器鏈的最頂部瘪撇;
當(dāng)?shù)竭_(dá)了構(gòu)造器鏈最頂部获茬,且已確保所有實(shí)例包含的存儲(chǔ)型屬性都已經(jīng)賦值,這個(gè)實(shí)例的內(nèi)存被認(rèn)為已經(jīng)完全初始化设江。此時(shí)階段1完成。


階段2:
從頂部構(gòu)造器鏈一直往下攘轩,每個(gè)構(gòu)造器鏈中類的指定構(gòu)造器都有機(jī)會(huì)進(jìn)一步定制實(shí)例叉存。構(gòu)造器此時(shí)可以訪問(wèn)self、修改它的屬性并調(diào)用實(shí)例方法等等度帮。
最終歼捏,任意構(gòu)造器鏈中的便利構(gòu)造器可以有機(jī)會(huì)定制實(shí)例和使用self稿存。

即不滿足階段二:訪問(wèn)self時(shí),類成員變量必須初始化瞳秽。想要初始化成員變量必須調(diào)用 City 的初始化方法瓣履,此時(shí)需要訪問(wèn)self,但是此時(shí)成員變量 capitalCity 卻沒(méi)有初始化练俐,根據(jù)初始化過(guò)程規(guī)則此時(shí)不能訪問(wèn)self袖迎,這就造成了矛盾。而使用var capitalCity: City!不會(huì)出現(xiàn)問(wèn)題腺晾,因?yàn)槠淠J(rèn)值為nil燕锥。在調(diào)用 City初始化方式的時(shí)候,capitalCity 已經(jīng)初始化過(guò)了悯蝉,其值彼時(shí)為nil归形。

當(dāng)然你可以自己試下,改成 let capitalCity: City 后鼻由,編譯器會(huì)報(bào)如下錯(cuò)誤:

Playground execution failed: error: Constructor.xcplaygroundpage:30:28: error: 'self' used before all stored properties are initialized
self.capitalCity = City(name: capitalName, country: self)
^

Constructor.xcplaygroundpage:27:9: note: 'self.capitalCity' not initialized
var capitalCity: City
^

error: Constructor.xcplaygroundpage:30:61: error: variable 'self.capitalCity' used before being initialized
self.capitalCity = City(name: capitalName, country: self)
^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暇榴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蕉世,更是在濱河造成了極大的恐慌蔼紧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讨彼,死亡現(xiàn)場(chǎng)離奇詭異歉井,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)哈误,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門哩至,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜜自,你說(shuō)我怎么就攤上這事菩貌。” “怎么了重荠?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵箭阶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我戈鲁,道長(zhǎng)仇参,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任婆殿,我火速辦了婚禮诈乒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婆芦。我一直安慰自己怕磨,他們只是感情好喂饥,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肠鲫,像睡著了一般员帮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导饲,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天捞高,我揣著相機(jī)與錄音,去河邊找鬼帜消。 笑死棠枉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泡挺。 我是一名探鬼主播辈讶,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娄猫!你這毒婦竟也來(lái)了贱除?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤媳溺,失蹤者是張志新(化名)和其女友劉穎月幌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悬蔽,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扯躺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝎困。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录语。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖禾乘,靈堂內(nèi)的尸體忽然破棺而出澎埠,到底是詐尸還是另有隱情,我是刑警寧澤始藕,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布蒲稳,位于F島的核電站,受9級(jí)特大地震影響伍派,放射性物質(zhì)發(fā)生泄漏江耀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一诉植、第九天 我趴在偏房一處隱蔽的房頂上張望祥国。 院中可真熱鬧,春花似錦倍踪、人聲如沸系宫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扩借。三九已至,卻和暖如春缤至,著一層夾襖步出監(jiān)牢的瞬間潮罪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工领斥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫉到,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓月洛,卻偏偏與公主長(zhǎng)得像何恶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚼黔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 123.繼承 一個(gè)類可以從另外一個(gè)類繼承方法,屬性和其他特征细层。當(dāng)一個(gè)類繼承另外一個(gè)類時(shí), 繼承類叫子類, 被繼承的...
    無(wú)灃閱讀 1,396評(píng)論 2 4
  • 本章將會(huì)介紹 自動(dòng)引用計(jì)數(shù)的工作機(jī)制自動(dòng)引用計(jì)數(shù)實(shí)踐類實(shí)例之間的循環(huán)強(qiáng)引用解決實(shí)例之間的循環(huán)強(qiáng)引用閉包引起的循環(huán)強(qiáng)...
    寒橋閱讀 911評(píng)論 0 0
  • 126.析構(gòu)器 在一個(gè)類實(shí)例銷毀前,一個(gè)析構(gòu)器會(huì)立即調(diào)用碎节。使用deinit 關(guān)鍵字來(lái)表示析構(gòu)器, 跟構(gòu)造器寫法類似...
    無(wú)灃閱讀 812評(píng)論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理捧搞,服務(wù)發(fā)現(xiàn),斷路器狮荔,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 這篇文章主要是寫給我自己看的轴合。特別是當(dāng)我和愛(ài)人發(fā)生爭(zhēng)執(zhí)的時(shí)候创坞,需要看一看,平復(fù)一下激動(dòng)的心情受葛。 愛(ài)人有很多優(yōu)點(diǎn)题涨,下...
    小亞思de小天地閱讀 576評(píng)論 0 5