autoreleasepool 學(xué)習(xí)筆記

前言

關(guān)于AutoreleasePool的實(shí)現(xiàn)原理导盅,有很多很多優(yōu)秀的博客(都是大神們無私的奉獻(xiàn))僻澎,他們都對其進(jìn)行了詳細(xì)的介紹扁誓,我也是看這些文章配合runtime源碼進(jìn)行學(xué)習(xí)的。文章只是做了一些干練的總結(jié)脱盲,方便自己或者他人復(fù)習(xí),具體的細(xì)節(jié)以及分析就不寫了(大神們寫得太好了)日缨,想要學(xué)習(xí)的移步大神們的博客钱反。(ps: 雖然這些博客中的runtime部分源碼已經(jīng)修改,但是其基本邏輯還是沒有變動的匣距,runtime可調(diào)式工程在此下載

大神的文章

黑幕背后的Autorelease - sunnyxx大神
Objective-C Autorelease Pool 的實(shí)現(xiàn)原理 - 雷純鋒的技術(shù)博客

@autoreleasepool的實(shí)質(zhì)

通過clang -rewrite-objc指令可以將:

int main (int argc, char * argv[]) {
    @autoreleasepool {

    }
}

轉(zhuǎn)換成:

extern "C" __declspec(dllimport) void * objc_autoreleasePoolPush(void);
extern "C" __declspec(dllimport) void objc_autoreleasePoolPop(void *);

struct __AtAutoreleasePool {
  __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}
  ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
  void * atautoreleasepoolobj;
};

#define __OFFSETOFIVAR__(TYPE, MEMBER) ((long long) &((TYPE *)0)->MEMBER)


int main (int argc, char * argv[]) {
 /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 

 }
}

可以看到編譯器實(shí)質(zhì)用一個棧上的c++對象來替換@autoreleasepool{}面哥;并在對象的構(gòu)造中調(diào)用了:objc_autoreleasePoolPush();在析構(gòu)中調(diào)用了:objc_autoreleasePoolPop(atautoreleasepoolobj)毅待。

其實(shí)際都是調(diào)用runtime中c++類AutoreleasePoolPagepushpop方法尚卫。

AutoreleasePoolPage的定義

看一下AutoreleasePoolPage中定義的成員變量:

class AutoreleasePoolPage 
{
    magic_t const magic;
    id *next;
    pthread_t const thread;
    AutoreleasePoolPage * const parent;
    AutoreleasePoolPage *child;
    uint32_t const depth;
    uint32_t hiwat;
}

各個變量基本上都能見其名知其意。

  • autorelease類型的對象都是通過AutoreleasePoolPage管理的尸红。
  • masOS中每個page的大小是4096個字節(jié)吱涉。

對于page的大小,可以從源碼中看到:

 static void * operator new(size_t size) {
    return malloc_zone_memalign(malloc_default_zone(), SIZE, SIZE);
}
static void operator delete(void * p) {
    return free(p);
}

其重寫了運(yùn)算newdelete外里,而SIZEmacOS下定義為4096怎爵。

  • 內(nèi)存從低址值存依次放著各個成員變量(56個字節(jié));然后存放POOL_BOUNDARYautorelease類型對象的指針盅蝗。
  • 其中next是指向下一個autorelease類型對象的指針該存放的位置鳖链。
  • 每個AutoreleasePoolPage對象通過parentchild來連接(雙鏈表)。
  • autoreleasepool中嵌套autoreleasepool實(shí)際上是在pagepush一個POOL_BOUNDARY(nil)风科。

當(dāng)調(diào)用對象的autorelease方法時撒轮,該對象的指針會被存放到page中乞旦,而當(dāng)page進(jìn)行pop操作時,會根據(jù)傳入的POOL_BOUNDARY(nil)指針的地址來釋放大于此地址的page中的對象题山。

結(jié)尾

紙上得來終覺淺兰粉,絕知此事要躬行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顶瞳,一起剝皮案震驚了整個濱河市玖姑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨菱,老刑警劉巖焰络,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異符喝,居然都是意外死亡闪彼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門协饲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏腕,“玉大人,你說我怎么就攤上這事茉稠∶柘冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵而线,是天一觀的道長铭污。 經(jīng)常有香客問我,道長膀篮,這世上最難降的妖魔是什么嘹狞? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮各拷,結(jié)果婚禮上刁绒,老公的妹妹穿的比我還像新娘。我一直安慰自己烤黍,他們只是感情好知市,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著速蕊,像睡著了一般嫂丙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上规哲,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天跟啤,我揣著相機(jī)與錄音,去河邊找鬼。 笑死隅肥,一個胖子當(dāng)著我的面吹牛竿奏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腥放,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼泛啸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秃症?” 一聲冷哼從身側(cè)響起候址,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎种柑,沒想到半個月后岗仑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聚请,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年荠雕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶赏。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舞虱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出母市,到底是詐尸還是另有隱情,我是刑警寧澤损趋,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布患久,位于F島的核電站,受9級特大地震影響浑槽,放射性物質(zhì)發(fā)生泄漏蒋失。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一桐玻、第九天 我趴在偏房一處隱蔽的房頂上張望篙挽。 院中可真熱鬧,春花似錦镊靴、人聲如沸铣卡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煮落。三九已至,卻和暖如春踊谋,著一層夾襖步出監(jiān)牢的瞬間蝉仇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轿衔,地道東北人沉迹。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像害驹,于是被迫代替她去往敵國和親鞭呕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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