內(nèi)存管理

1. 內(nèi)存布局

  • 保留區(qū) --> 內(nèi)核去 (低~高)
  • 代碼段 --> 已初始化數(shù)據(jù)(.data)--> 未初始化數(shù)據(jù)(.bss)(低~高)
  • 堆(由低到高) --> 棧(由高到低)(低~高)
  • stack:方法調(diào)用
  • heap:通過alloc等分配的對象
  • bss:未初始化的全局變量
  • data:已初始化的全局變量
  • text:代碼段

2. 內(nèi)存管理方案

  • TaggedPointer
  • NONOPOINTER_ISA(64位架構(gòu)下)
  • 散列表(SideTable)
  1. NONPOINTER_ISA(64位)
  • [0] indexed: 標(biāo)志位 0 代表純指針空扎, 1 代表指針中包含其他內(nèi)容
  • [1] has_assoc: 是否有關(guān)聯(lián)對象
  • [2] has_cxx_dior: 當(dāng)前對象是都有 c++ 的相關(guān)內(nèi)容
  • [3 ~ 35] shiftcls: 共33位调鬓,表示當(dāng)前對象類對象的指針地址
  • [36 ~ 41] magic: 不涉及
  • [42] weakly_referenced: 是否有弱引用
  • [43] deallocating: 是否正在進(jìn)行 dealloc 操作
  • [44] has_sidetable_rc:是否有額外使用SideTable 計算引用計數(shù)內(nèi)容
  • [45 ~ 63]extra_rc 在指針中記錄引用計數(shù)
  1. SideTables() 結(jié)構(gòu)
  • 哈希表(快速定位)
  • spinlock_t (自旋鎖蒸绩,分離鎖)
  • 引用計數(shù)表
  • 弱引用表
  1. Spinlock_t
  • Spinlock_t 是 “忙等” 的鎖聪姿。
  • 適用于輕量訪問
  1. RefcountMap(引用計數(shù)表)
  • 通過“指針” ptr 通過哈希查找,找到對象的引用計數(shù)
  1. weak_table_t (弱引用計數(shù)表)
  • 哈希表

3. 引用計數(shù)管理

  • alloc
    調(diào)用C函數(shù) calloc

  • retain

    1. 獲取到當(dāng)前對象的 SideTable
    2. SideTable 獲取當(dāng)前對象的引用計數(shù)值
    3. 引用計數(shù)值 + 1
  • release

    1. 獲取到當(dāng)前對象的 SideTable
    2. SideTable 獲取當(dāng)前對象的引用計數(shù)值
    3. 引用計數(shù)值 - 1
  • retainCount

    1. 獲取到當(dāng)前對象的 SideTable
    2. SideTable 獲取當(dāng)前對象的引用計數(shù)值
    3. 引用計數(shù)值 + 1
  • dealloc
    當(dāng)前對象是否可以直接釋放一句以下判斷條件
    nonpointer_isa
    weakly_referenced
    has_assoc 是否有關(guān)聯(lián)對象
    has_cxx_dtor 是否有C++內(nèi)容涩惑,或是否使用arc管理內(nèi)存
    has_sidetable_rc 當(dāng)前對象的引用計數(shù)是否通過sidetable表維護(hù)的
    以上全部為否才可以調(diào)用C函數(shù)直接釋放
    否則就要調(diào)用object_dispose() 進(jìn)行釋放

  • object_dispose
    開始
    objc_destructInstance(): c++釋放榕栏、移除關(guān)聯(lián)對象计螺、將弱引用指針置位nil、清除引用計數(shù)
    c函數(shù)free()
    結(jié)束

4. 弱引用管理

添加弱引用變量的流程
objc_initWeak()
storeWeak()
weak_register_no_lock()
1 通過對象指針hash計算查找
2 如果已經(jīng)存在了弱引用數(shù)組冶忱,則添加
3 如果沒有尾菇,則創(chuàng)建弱引用數(shù)組
清除weak變量,同事設(shè)置為nil

5. 自動釋放池

  • runloop將要結(jié)束時調(diào)用pop操作
  • 多層嵌套就是多次插入哨兵對象
  • 在for循環(huán)中alloc創(chuàng)建了較大的內(nèi)存消耗是囚枪,可手動插入autoReleasePool來釋放內(nèi)存對象

6. 循環(huán)引用

自循環(huán)引用
相互循環(huán)應(yīng)用
多循環(huán)引用
如何破除

避免產(chǎn)生
在合適的時機(jī)手動破除循環(huán)引用
__weak
__block(ARC下會被強(qiáng)引用)
__unsafe_unretained 修飾對象不會增加引用計數(shù)派诬,但是會產(chǎn)生懸垂指針

解決NSTimer的循環(huán)引用問題
NSTimer會被Runloop引用,所以必須手動釋放NSTimer來解除引用链沼。
采用中間對象默赂,同時弱引用NSTimer和對象,當(dāng)對象被釋放后忆植,NSTimer回調(diào)后放可,判斷弱引用對象已經(jīng)釋放為nil,此時則invalidate timer朝刊,將NSTimer置位nil耀里,此時NSTimer也被成功釋放。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拾氓,一起剝皮案震驚了整個濱河市冯挎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咙鞍,老刑警劉巖房官,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異续滋,居然都是意外死亡翰守,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門疲酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜡峰,“玉大人了袁,你說我怎么就攤上這事∈” “怎么了载绿?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長油航。 經(jīng)常有香客問我崭庸,道長,這世上最難降的妖魔是什么谊囚? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任怕享,我火速辦了婚禮,結(jié)果婚禮上秒啦,老公的妹妹穿的比我還像新娘熬粗。我一直安慰自己,他們只是感情好余境,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布驻呐。 她就那樣靜靜地躺著,像睡著了一般芳来。 火紅的嫁衣襯著肌膚如雪含末。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天即舌,我揣著相機(jī)與錄音佣盒,去河邊找鬼。 笑死顽聂,一個胖子當(dāng)著我的面吹牛肥惭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紊搪,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蜜葱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耀石?” 一聲冷哼從身側(cè)響起牵囤,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滞伟,沒想到半個月后揭鳞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梆奈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年野崇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亩钟。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡乓梨,死狀恐怖钥弯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情督禽,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布总处,位于F島的核電站狈惫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹦马。R本人自食惡果不足惜胧谈,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荸频。 院中可真熱鬧菱肖,春花似錦、人聲如沸旭从。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽和悦。三九已至退疫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸽素,已是汗流浹背褒繁。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留馍忽,地道東北人棒坏。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像遭笋,于是被迫代替她去往敵國和親坝冕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 數(shù)據(jù)結(jié)構(gòu) *Spinlock_t*RefcountMap*weak_table_t Spinlock_t: *Sp...
    BabyNeedCare閱讀 549評論 1 2
  • 1坐梯、內(nèi)存布局 stack:方法調(diào)用 heap:通過alloc等分配對象 bss:未初始化的全局變量等徽诲。 data:...
    AKyS佐毅閱讀 1,592評論 0 19
  • 內(nèi)存布局 ① 棧區(qū)stack:方法調(diào)用會在棧區(qū)展開;② 堆區(qū)heap:通過alloc分配的對象吵血,copy后的blo...
    小王的知識屋閱讀 342評論 0 0
  • 內(nèi)存布局 stack區(qū):方法調(diào)用 heap區(qū) (堆區(qū)):alloc分配的一些對象 bss :未初始化的全局變量 d...
    叔簡閱讀 464評論 0 1
  • 在開發(fā)中谎替,內(nèi)存管理是一個必要的技能,研究iOS 開發(fā)蹋辅,我們通過內(nèi)存布局钱贯、內(nèi)存管理方案、數(shù)據(jù)結(jié)構(gòu)侦另、ARC/MRC秩命、引...
    大馮宇宙閱讀 722評論 0 3