Object-C內(nèi)存

一.內(nèi)存布局

內(nèi)存布局圖


1.stack:方法調(diào)用

2.heap:通過alloc等分配的對(duì)象

3.bss:未初始化的全局變量和未初始化的靜態(tài)變量等

4.data:已初始化的全局變量和已初始化的靜態(tài)變量等

5.text:程序的代碼段


二柑船、內(nèi)存管理方案

OC針對(duì)于不同場(chǎng)景的管理方案

1.TaggedPointer:針對(duì)小對(duì)象(NSNumber等)

2.NONPOINTER_ISA:針對(duì)64位架構(gòu)下的ios應(yīng)用程序擎颖,isa占64bit的羞反,實(shí)際上32bit或者40bit就夠用了科吭,其他的為了提升利用率,用于內(nèi)存管理方面的相關(guān)內(nèi)容浑此,所以說(shuō)這叫非指針型的isa

3.散列表:是一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(包括了引用計(jì)數(shù)表累颂,和弱引用表)

散列表的實(shí)現(xiàn)方案是通過SideTables方案來(lái)實(shí)現(xiàn)的,在不同的系統(tǒng)下SideTables的SideTable是有不同的個(gè)數(shù)的,在非嵌入式系統(tǒng)下有64個(gè)尤勋。入下圖所示

SideTables結(jié)構(gòu)圖



SideTable結(jié)構(gòu)圖


三、MRC

1.alloc:給對(duì)想分配內(nèi)存空間 (實(shí)現(xiàn):1.經(jīng)過一系列函數(shù)的封裝和調(diào)用茵宪,最終調(diào)用了c函數(shù)的calloc最冰。2.此時(shí)并沒有設(shè)置引用計(jì)數(shù)加1)

2.retain:引用計(jì)數(shù)加1

retain實(shí)現(xiàn):

SideTable& table = SideTables()[this] ;

size_t& refcntStorage = table.refcnts[this];

refcntStorage += SIDE_TABLE_RC_ONE;

通過兩次Hash查找,查到當(dāng)前對(duì)象引用計(jì)數(shù)表稀火,執(zhí)行加1造作


3.release:引用計(jì)數(shù)減1

release實(shí)現(xiàn)

SideTable& table = SideTables()[this] ;

RefcountMap::iterator it= table.refcnts.find(this);

it->sencont -= SIDE_TABLE_RC_ONE;

4.retainCount:獲取當(dāng)前對(duì)象的引用計(jì)數(shù)值

retainCount實(shí)現(xiàn)

SideTable& table = SideTables()[this] ;

size_t refcnt_result = 1;

RefcountMap::iterator it = table.refcnts.find(this);

refcnt_result +=?it->sencont >> SIDE_TABLE_RC_SHIFT;

5.autorelease:如果當(dāng)前對(duì)象調(diào)用了autorelease操作會(huì)在autoreleasepool結(jié)束的時(shí)候會(huì)調(diào)用release操作進(jìn)行引用計(jì)數(shù)減1

6.dealloc:顯式調(diào)用super.dealloc來(lái)釋放或者廢棄父類的相關(guān)成員變量


delloc實(shí)現(xiàn)

nonpointer_isa:非指針型isa

weakly_referenced:當(dāng)前對(duì)象是否有weak指針指向它

hea_assoc:當(dāng)前對(duì)象是否有關(guān)聯(lián)對(duì)象

has_cxx_dtor:判斷當(dāng)前對(duì)象內(nèi)部實(shí)現(xiàn)是否有c++實(shí)現(xiàn)的內(nèi)容以及當(dāng)前對(duì)象是否使用ARC來(lái)管理內(nèi)存

has_sidtable_rc:當(dāng)前對(duì)象是否通過sidetable引用計(jì)數(shù)表來(lái)維護(hù)的

free():C函數(shù)清理內(nèi)存


object_dispose()

objc_destructInstance()實(shí)現(xiàn)


objc_destructInstance()實(shí)現(xiàn)

clearDeallocation()實(shí)現(xiàn)

clearDeallocation()實(shí)現(xiàn)

四暖哨、ARC

1.ARC其實(shí)是編譯器自動(dòng)添加retain和release之外還需要runtime功能進(jìn)行支持,然后由LLVM編譯器和runtime協(xié)作才能組成ARC全部的功能

2.ARC中禁止手動(dòng)調(diào)用retain/release/retainCount/dealloc(可以重寫dealloc凰狞,但是不能顯式調(diào)用super.dealloc)

3.ARC中新增了weak篇裁、和Strong屬性關(guān)鍵字


五、弱引用管理



1.系統(tǒng)是怎樣把一個(gè)weak變量添加到它對(duì)應(yīng)的弱引用表當(dāng)中的赡若?

一個(gè)被聲明__weak的對(duì)象指針达布,經(jīng)過編譯器編譯之后,會(huì)調(diào)用objc_initWeak() 函數(shù)逾冬,經(jīng)過一系列函數(shù)調(diào)用黍聂,會(huì)在weak_register_no_lock()函數(shù)當(dāng)中進(jìn)行弱引用添加,具體添加的位置是通過一個(gè)hash算法來(lái)查找的身腻,如果查找的當(dāng)前對(duì)象已經(jīng)有了弱引用對(duì)象數(shù)組产还,就把新的弱引用對(duì)象添加到弱引用數(shù)組中,如果沒有的話從新創(chuàng)建一個(gè)弱引用數(shù)組然后把第0個(gè)位置添加上弱引用指針

2.面試題:當(dāng)一個(gè)對(duì)象被廢棄后嘀趟,weak變量為什么會(huì)被置為nil

當(dāng)一個(gè)對(duì)象被dealloc之后脐区,在dealloc內(nèi)部實(shí)現(xiàn)當(dāng)中會(huì)調(diào)用弱引用清除的函數(shù)weak_clear_no_lock(), 在該函數(shù)的內(nèi)部實(shí)現(xiàn)當(dāng)中根據(jù)當(dāng)前對(duì)象指針查找當(dāng)前對(duì)象相對(duì)應(yīng)的的弱引用把當(dāng)前對(duì)象的弱引用都拿出來(lái)形成一個(gè)數(shù)組,遍歷弱應(yīng)用數(shù)組當(dāng)中所有的弱引用指針分別置為nil


六她按、自動(dòng)釋放池




AutoreleasePoolPage::push的實(shí)現(xiàn)原理:next指向一個(gè)空地址牛隅,在調(diào)用AutoreleasePoolPage::push的時(shí)候會(huì)在next指向的空地址添加一個(gè)哨兵對(duì)象炕柔,next指針指向下一個(gè)可入棧的位置

AutoreleasePoolPage::pop實(shí)現(xiàn)原理:根據(jù)傳入的哨兵對(duì)象找到正確的位置,給上次push操作之后添加的對(duì)象依次是發(fā)送release消息倔叼,然后回退next指針到正確的位置汗唱。

1.AutoreleasePool的實(shí)現(xiàn)原理是什么?

是以棧為節(jié)點(diǎn)通過雙向鏈表的形式組合而成

2.AutoreleasePool為何可以嵌套使用丈攒?

多層嵌套就是多次插入哨兵對(duì)象哩罪,每次進(jìn)行@Autorelease代碼塊創(chuàng)建的時(shí)候系統(tǒng)就會(huì)為我們進(jìn)行一個(gè)哨兵對(duì)象的插入,然后完成一個(gè)新的autorelease創(chuàng)建

3.什么是自動(dòng)釋放池或者說(shuō)自動(dòng)釋放池的結(jié)構(gòu)是怎樣的巡验?

是以棧為節(jié)點(diǎn)通過雙向鏈表的形式組合而成

在for循環(huán)中alloc圖片數(shù)據(jù)等內(nèi)存消耗較大的場(chǎng)景手動(dòng)插入autoreleasePool每次for循環(huán)都進(jìn)行一次內(nèi)存釋放來(lái)降低內(nèi)存的峰值际插,防止內(nèi)存過大所導(dǎo)致的一些問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末显设,一起剝皮案震驚了整個(gè)濱河市框弛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捕捂,老刑警劉巖瑟枫,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異指攒,居然都是意外死亡慷妙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門允悦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膝擂,“玉大人,你說(shuō)我怎么就攤上這事隙弛〖懿觯” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵全闷,是天一觀的道長(zhǎng)叉寂。 經(jīng)常有香客問我,道長(zhǎng)总珠,這世上最難降的妖魔是什么办绝? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮姚淆,結(jié)果婚禮上孕蝉,老公的妹妹穿的比我還像新娘。我一直安慰自己腌逢,他們只是感情好降淮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般佳鳖。 火紅的嫁衣襯著肌膚如雪霍殴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天系吩,我揣著相機(jī)與錄音来庭,去河邊找鬼。 笑死穿挨,一個(gè)胖子當(dāng)著我的面吹牛月弛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播科盛,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼帽衙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贞绵?” 一聲冷哼從身側(cè)響起厉萝,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榨崩,沒想到半個(gè)月后谴垫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡母蛛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年翩剪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯祸。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肢专,死狀恐怖舞肆,靈堂內(nèi)的尸體忽然破棺而出焦辅,到底是詐尸還是另有隱情,我是刑警寧澤椿胯,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布筷登,位于F島的核電站,受9級(jí)特大地震影響哩盲,放射性物質(zhì)發(fā)生泄漏前方。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一廉油、第九天 我趴在偏房一處隱蔽的房頂上張望惠险。 院中可真熱鬧,春花似錦抒线、人聲如沸班巩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抱慌。三九已至逊桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抑进,已是汗流浹背强经。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寺渗,地道東北人匿情。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像户秤,于是被迫代替她去往敵國(guó)和親码秉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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