第二十九篇:Swift指針和內(nèi)存管理

指針

為什么說指針不安全
1)比如我們在創(chuàng)建一個對象的時候殊霞,是需要在堆分配內(nèi)存空間的。但是這個內(nèi)存空間的聲明周期是有限的暂题,也就意味著如果我們使用指針指向這塊內(nèi)容空間啥纸,如果當(dāng)前內(nèi)存空間的生命周期到了(引用計數(shù)為0),那么我們當(dāng)前的指針是不是就變成了未定義的行為了誓斥。

2)我們創(chuàng)建的內(nèi)存空間是有邊界的只洒,比如我們創(chuàng)建一個大小為10的數(shù)組,這個時候我們通過指針訪問到了index = 11的位置劳坑,這個時候是不是就越界了毕谴,訪問了一個未知的內(nèi)存空間。

3)指針類型與內(nèi)存的值類型不一致距芬,也是不安全的墓拜。

Swift里的指針類型

Swift中的指針分為兩類球订,typed pointer指定數(shù)據(jù)類型指針给赞,raw pointer未指定數(shù)據(jù)類型的指針(原生指針)砾跃。基本上我們接觸到的指針類型有以下幾種:


8261670412046_.pic.jpg

泛型指針的使用

  這里的泛型指針相比較原生指針來說离斩,其實就是指定當(dāng)前指針已經(jīng)綁定到了具體的類型银舱。在進行泛型指針訪問的過程中瘪匿,我們并不是使用load和store方法來進行存儲操作,這里我們使用到當(dāng)前泛型指針內(nèi)置的變量pointee寻馏。
8281670425941_.pic.jpg

還有一種方式就是直接分配內(nèi)存

8291670426030_.pic.jpg

Swift與OC里的不同的是棋弥,直接定義指針存儲的類型(這里用存的是LGStruct類型),其中通過allocate去創(chuàng)建操软,然后通過deallocate()去釋放嘁锯。

8301670426215_.pic.jpg

內(nèi)存綁定

Swift提供了三種不同的API來綁定/重新綁定指針:
1)assumingMemoryBound(to:)
2)bindMemory(to:capacity:)
3)withMemoryRebound(to:capacity:body:)(臨時改變內(nèi)存綁定)

下面是用assumingMemoryBound來的:這個是告知編譯器我當(dāng)前是Int類型,不需要額外進行檢查聂薪,直接使用家乘。


8391670478559_.pic.jpg

內(nèi)存管理

swift中使用自動引用計數(shù)(ARC)機制來追蹤和管理內(nèi)存。

首先我們先找到 RefCount 的定義藏澳,這里我們在HeapObject.h文件中

8401670505912_.pic.jpg

在源碼里通過分析仁锯,可以得到引用計數(shù)是存放中RefcountBitsInt里,這個是一個64bit的位 域計數(shù)翔悠,下面是各個地址存儲的信息业崖。


8411670507641_.pic.jpg
8421670509157_.pic.jpg

下面是對應(yīng)的swift里的引用計數(shù)的代碼,使用了swift_retain函數(shù)蓄愁,進行refCounts的增加双炕。

8431670578808_.pic.jpg
8441670578840_.pic.jpg

下面這段代碼就產(chǎn)生了兩個實例對象強引用,swift提供了兩種辦法用來解決使用類的屬性時所遇到的循環(huán)強引用問題撮抓,弱引用(weak reference )和無主引用(unowned reference)妇斤。


image.png

聲明一個weak變量相當(dāng)于定義了一個weakrefrence對象


8461670582053_.pic.jpg

同時在swift里的引用計數(shù)用到了sideTable來存儲:


8471670582172_.pic.jpg

Swift中存在兩種引用計數(shù),一種是inlineRefCount是丹拯,一種是SideTableRefCounts站超。Side Table是一種類名為

HeapObjectSizeTableEntry的結(jié)構(gòu),里面也有RefCounts成員乖酬,是內(nèi)部是SizeTableRefCountBits死相,其實就是原來的uint64_t加上一個存儲弱引用數(shù)的uint32_t。

8481670582504_.pic.jpg

這里我們來總結(jié)一下我們當(dāng)前的引用計數(shù)咬像,一個對象在初始化的時候后是沒有SizeTable的算撮,當(dāng)我們創(chuàng)建一個弱引用的時候,系統(tǒng)會創(chuàng)建一個SizeTale县昂。

弱引用

弱引用不會對其引用的實例保持強引用肮柜,因而不會阻止ARC釋放被引用的實例,這個特性阻止了引用變?yōu)檠h(huán)引用七芭。聲明屬性或者變量時素挽,在前面加上weak關(guān)鍵字表明這是一個弱引用蔑赘。

由于弱引用不會強保持對實例的引用狸驳,所以說實例被釋放了弱引用仍舊引用著這個實例也是有可能预明。因此,ARC會在被引用的實例被釋放是自動地設(shè)置弱引用為nil耙箍。由于弱引用需要允許它們的值為nil撰糠,它們一定得是可選類型。

Unowned(無主引用)

和弱引用類似辩昆,無主引用不會牢牢保持住引用的實例阅酪。但是不像弱引用,總之汁针,無主引用假定是永遠有值的术辐。

根據(jù)蘋果的官方文檔的建議,當(dāng)我們知道兩個對象的生命周期并不相關(guān)施无,那么我們必須使用weak辉词。相反,非強引用對象擁有和強引用對象同樣或者更長的生命周期的話猾骡,則應(yīng)該使用unowned瑞躺。

8491670589662_.pic.jpg

當(dāng)遇到循環(huán)引用我們用weak修飾時候,對象會被提前釋放兴想,如果使用withExtendedLifetime去延遲將要被釋放的對象的生命周期幢哨。

8501670592083_.pic.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嫂便,隨后出現(xiàn)的幾起案子捞镰,更是在濱河造成了極大的恐慌,老刑警劉巖顽悼,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曼振,死亡現(xiàn)場離奇詭異,居然都是意外死亡蔚龙,警方通過查閱死者的電腦和手機冰评,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來木羹,“玉大人甲雅,你說我怎么就攤上這事】犹睿” “怎么了抛人?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脐瑰。 經(jīng)常有香客問我妖枚,道長,這世上最難降的妖魔是什么苍在? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任绝页,我火速辦了婚禮荠商,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘续誉。我一直安慰自己莱没,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布酷鸦。 她就那樣靜靜地躺著饰躲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪臼隔。 梳的紋絲不亂的頭發(fā)上嘹裂,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音摔握,去河邊找鬼焦蘑。 笑死,一個胖子當(dāng)著我的面吹牛盒发,可吹牛的內(nèi)容都是我干的例嘱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼宁舰,長吁一口氣:“原來是場噩夢啊……” “哼拼卵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛮艰,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤腋腮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后壤蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體即寡,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年袜刷,在試婚紗的時候發(fā)現(xiàn)自己被綠了聪富。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡著蟹,死狀恐怖墩蔓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萧豆,我是刑警寧澤奸披,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站涮雷,受9級特大地震影響阵面,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一样刷、第九天 我趴在偏房一處隱蔽的房頂上張望嗽交。 院中可真熱鬧,春花似錦颂斜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梅肤,卻和暖如春司蔬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姨蝴。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工俊啼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人左医。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓授帕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浮梢。 傳聞我的和親對象是個殘疾皇子跛十,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

  • 指針 為什么說指針不安全 比如我們在創(chuàng)建一個對象的時候,是需要在堆分配內(nèi)存空間的秕硝。但是這個內(nèi)存空間的聲明周期是有限...
    晨曦的簡書閱讀 353評論 0 1
  • 一芥映、指針 ?? 1、指針類型 ??Swift中的指針分為兩類:指定數(shù)據(jù)類型的指針(typed pointer);未...
    spyn_n閱讀 870評論 1 4
  • 一、指針 1.1 為什么說指針不安全 ?如我們在創(chuàng)建?個對象的時候躯护,是需要在堆分配內(nèi)存空間的惊来。但是這個內(nèi)存空間的生...
    常在士心閱讀 431評論 0 1
  • 一.為什么說指針不安全 比如我們在創(chuàng)建一個對象的時候,是需要在堆分配內(nèi)存空間的棺滞。但是這個內(nèi)存空間的聲明周期是有限的...
    MissStitch丶閱讀 781評論 1 8
  • 一:指針 1. 指針的定義 Swift 中引用了某個引用類型實例的常量或變量唁盏,與 C 語言中的指針類似,不過它并不...
    Lee_Toto閱讀 442評論 0 3