內(nèi)存管理

一葛作、內(nèi)存布局
內(nèi)核區(qū)-》棧(stack)-》堆(heap)-》未初始化數(shù)據(jù)(.bss)-》已初始化數(shù)據(jù)(.data)-》代碼段(.text)-》保留

在ios中定義的方法或者函數(shù)都是在內(nèi)存的棧區(qū)進(jìn)行工作的挂捻,棧是由高地址向低地址。
創(chuàng)建的對(duì)象或者block進(jìn)行copy之后會(huì)轉(zhuǎn)移到堆上去,堆的內(nèi)存地址是由低地址向高地址增長

stack:方法調(diào)用
heap:通過alloc分配的對(duì)象,copy之后的block
bss:未初始化的全區(qū)變量
data:已初始化的全局變量
text:程序代碼

iOS是怎么樣進(jìn)行管理的:小對(duì)象是TaggedPointer,64位架構(gòu)下NONPOINTER_ISA箕宙,散列表(弱引用表,和應(yīng)用計(jì)數(shù)表)
arm64位下的NONPOINTER_ISA上的64位0或1分表存儲(chǔ)和表示了很多信息
side tables(散列表)是一個(gè)哈希表里面里面存儲(chǔ)了很多side table铺纽,每個(gè)side table里存儲(chǔ)了spinlock_t(自旋鎖)柬帕、RefcountMap(引用計(jì)數(shù))、weak_table_t(弱引用表)狡门,為什么是多個(gè)side table陷寝,是因?yàn)闉榱私鉀Q訪問效率問題,采用了分離所融撞。
Spinlock_t 是忙等鎖盼铁,適用于輕量級(jí)的訪問
RefcountMap 使用哈希表來實(shí)現(xiàn)的,為了提高查找效率尝偎,插入和取出是通過同一個(gè)哈希算法來決定的饶火,避免了遍歷
weak_table_t 也是一張哈希表

二鹏控、應(yīng)用計(jì)數(shù)

自動(dòng)引用計(jì)數(shù)ARC是LLVM(編譯器)和Runtime協(xié)作的結(jié)果,編譯器在編譯的時(shí)候在相應(yīng)的地方插入了release和autorelease肤寝,arc中禁止調(diào)動(dòng)retain当辐、release retainCount、dealloc鲤看,arc中新增了weak和strong關(guān)鍵字

alloc:經(jīng)過一系列的調(diào)用最終調(diào)用了c函數(shù)的calloc缘揪,此時(shí)并沒有設(shè)置引用計(jì)數(shù)為1
retain :通過兩次的hash查找對(duì)其引用計(jì)數(shù)進(jìn)行+1
release:通過hash到sedetable中查找到相應(yīng)的值進(jìn)行-1操作
retianCount:定義了一個(gè)局部變量1,再加上去sidetable中查出的應(yīng)用計(jì)數(shù)值义桂,所以alloc出來后的引用計(jì)數(shù)并沒有設(shè)置為1
dealloc:首先要判斷是否可以直接釋放(nonpointer_isa,weakly_refrenced,has_assoc,has_cxx_dtor,has_table_rc)如果可以則直接調(diào)用free找筝,如果不行則需要調(diào)用object_dispose,通過dealloc實(shí)現(xiàn)源碼可以判斷關(guān)系對(duì)象在使用后不需要手動(dòng)銷毀
一個(gè)對(duì)象由weak指針指向他慷吊,對(duì)象被銷毀了為什么指針會(huì)置為nil袖裕,是因?yàn)閷?duì)象的dealloc對(duì)若引用指針置為nil(weak_clear_no_lock)

三、自動(dòng)釋放
自動(dòng)釋放池是怎么實(shí)現(xiàn)的溉瓶,是以棧為節(jié)點(diǎn)通過雙向鏈表形式組合而成的急鳄,是和線程一一對(duì)應(yīng)的,AutoreleasePoolPage就相當(dāng)于每一個(gè)節(jié)點(diǎn)
@autoreleasepool相當(dāng)于如下代碼
AutoreleasePoolPage::push
{
代碼片段
}
AutoreleasePoolPage::pop
在當(dāng)次runloop將要結(jié)束的時(shí)候會(huì)調(diào)用AutoreleasePoolPage::pop
多層嵌套調(diào)用是多次插入哨兵報(bào)對(duì)象(next)
使用場景:在for循環(huán)中alloc圖片數(shù)據(jù)等內(nèi)存消耗比較大的場景中插入autoreleasePool,在每一次for循環(huán)都進(jìn)行釋放來防止內(nèi)存占用過大

四堰酿、循環(huán)引用
自循環(huán)引用疾宏、相互循環(huán)引用(代理)、多循環(huán)引用
破解方法:避免產(chǎn)生循環(huán)引用触创,在合適的時(shí)機(jī)斷開引用坎藐,__waek,__block(在mrc下不會(huì)增加引用計(jì)數(shù)嗅榕,避免了循環(huán)引用顺饮,arc下修飾會(huì)被對(duì)象強(qiáng)引用,無法避免循環(huán)引用凌那,需手動(dòng)破解),__unsafe_unretained(修飾對(duì)象不會(huì)增加引用計(jì)數(shù)吟逝,可以避免循引用帽蝶,如果被修飾對(duì)象在某一時(shí)機(jī)被釋放,會(huì)產(chǎn)生懸垂指針不安全)

NSTimer的循環(huán)引用問題
NSTimer產(chǎn)生是會(huì)由當(dāng)前線程的runloop強(qiáng)引用块攒,如果是重復(fù)的NSTimer需要建立一個(gè)中間對(duì)象励稳,定義一個(gè)中間對(duì)象,分別對(duì)timer和vc進(jìn)行弱引用囱井,在中間對(duì)象中進(jìn)行定時(shí)器方法的調(diào)用驹尼,如果發(fā)現(xiàn)vc被銷毀了對(duì)nstimer進(jìn)行invalidate和置為nil

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庞呕,隨后出現(xiàn)的幾起案子新翎,更是在濱河造成了極大的恐慌程帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件地啰,死亡現(xiàn)場離奇詭異愁拭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亏吝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門岭埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔚鸥,你說我怎么就攤上這事惜论。” “怎么了止喷?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵来涨,是天一觀的道長。 經(jīng)常有香客問我启盛,道長蹦掐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任僵闯,我火速辦了婚禮卧抗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳖粟。我一直安慰自己社裆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布向图。 她就那樣靜靜地躺著泳秀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榄攀。 梳的紋絲不亂的頭發(fā)上嗜傅,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音檩赢,去河邊找鬼吕嘀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贞瞒,可吹牛的內(nèi)容都是我干的偶房。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼军浆,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼棕洋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乒融,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤掰盘,失蹤者是張志新(化名)和其女友劉穎摄悯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庆杜,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡射众,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晃财。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叨橱。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖断盛,靈堂內(nèi)的尸體忽然破棺而出罗洗,到底是詐尸還是另有隱情,我是刑警寧澤钢猛,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布伙菜,位于F島的核電站,受9級(jí)特大地震影響命迈,放射性物質(zhì)發(fā)生泄漏贩绕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一壶愤、第九天 我趴在偏房一處隱蔽的房頂上張望淑倾。 院中可真熱鬧,春花似錦征椒、人聲如沸娇哆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碍讨。三九已至,卻和暖如春蒙秒,著一層夾襖步出監(jiān)牢的瞬間勃黍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工税肪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溉躲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓益兄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箭券。 傳聞我的和親對(duì)象是個(gè)殘疾皇子净捅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 1、內(nèi)存布局 stack:方法調(diào)用 heap:通過alloc等分配對(duì)象 bss:未初始化的全局變量等辩块。 data:...
    AKyS佐毅閱讀 1,606評(píng)論 0 19
  • 內(nèi)存布局 stack(棧區(qū)): 方法調(diào)用 heap(堆區(qū)):通過alloc等分配的對(duì)象 bss:未初始化的全局變量...
    Jimmy_L_Wang閱讀 627評(píng)論 1 3
  • 一.面試問題 使用CADisplayLink蛔六、NSTimer有什么注意點(diǎn)荆永?循環(huán)引用、NSTimer定時(shí)器不準(zhǔn) 介紹...
    蔚尼閱讀 870評(píng)論 0 1
  • 1. 對(duì)象與類 1.1 對(duì)象 對(duì)象(Class或id)內(nèi)部只有一個(gè)isa_t聯(lián)合體指針国章。isa_t聯(lián)合體內(nèi)部只有兩...
    我才是臭吉吉閱讀 730評(píng)論 0 2
  • 內(nèi)存分配方式 Objective-C內(nèi)存管理方式 1具钥、TaggedPointer iPhone5s開始采用64bi...
    一只長毛貓閱讀 482評(píng)論 0 2