iOS面試題:Autoreleasepool所使用的數(shù)據(jù)結構是什么尾序?AutoreleasePoolPage結構體了解么阔涉?

每創(chuàng)建一個池子氯析,會在首部創(chuàng)建一個 哨兵 對象,作為標記

最外層池子的頂端會有一個next指針登失。當鏈表容量滿了哈打,就會在鏈表的頂端塔逃,并指向下一張表。

Autorelease對象什么時候釋放料仗?

這個問題拿來做面試題湾盗,問過很多人,沒有幾個能答對的立轧。很多答案都是“當前作用域大括號結束時釋放”格粪,顯然木有正確理解Autorelease機制。

在沒有手加Autorelease Pool的情況下氛改,Autorelease對象是在當前的runloop迭代結束時釋放的帐萎,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop

例子:

__weak id reference = nil;
- (void)viewDidLoad {
    [super viewDidLoad];    NSString *str = [NSString stringWithFormat:@"sunnyxx"];    // str是一個autorelease對象,設置一個weak的引用來觀察它
    reference = str;
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];    
    NSLog(@"%@", reference); 
    // Console: sunnyxx
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];    
    NSLog(@"%@", reference); 
    // Console: (null)
}

當然胜卤,我們也可以手動干預Autorelease對象的釋放時機:

- (void)viewDidLoad
{
    [super viewDidLoad];
    @autoreleasepool {        NSString *str = [NSString stringWithFormat:@"sunnyxx"];
    }    NSLog(@"%@", str); 
// Console: (null)
}

Autorelease原理

AutoreleasePoolPage

ARC下疆导,我們使用@autoreleasepool{}來使用一個AutoreleasePool,隨后編譯器將其改寫成下面的樣子:

void *context = objc_autoreleasePoolPush();
// {}中的代碼objc_autoreleasePoolPop(context);

而這兩個函數(shù)都是對AutoreleasePoolPage的簡單封裝葛躏,所以自動釋放機制的核心就在于這個類澈段。

AutoreleasePoolPage是一個C++實現(xiàn)的類

  • AutoreleasePool并沒有單獨的結構悠菜,而是由若干個AutoreleasePoolPage以雙向鏈表的形式組合而成(分別對應結構中的parent指針和child指針)。
  • AutoreleasePool是按線程一一對應的(結構中的thread指針指向當前線程)败富。
  • AutoreleasePoolPage每個對象會開辟4096字節(jié)內存(也就是虛擬內存一頁的大谢诖住),除了上面的實例變量所占空間囤耳,剩下的空間全部用來儲存autorelease對象的地址篙顺。
  • 上面的id *next指針作為游標指向棧頂最新add進來的autorelease對象的下一個位置
  • 一個AutoreleasePoolPage的空間被占滿時充择,會新建一個AutoreleasePoolPage對象德玫,連接鏈表,后來的autorelease對象在新的page加入椎麦。

所以宰僧,若當前線程中只有一個AutoreleasePoolPage對象,并記錄了很多autorelease對象地址時內存如下圖:

圖中的情況观挎,這一頁再加入一個autorelease對象就要滿了(也就是next指針馬上指向棧頂)琴儿,這時就要執(zhí)行上面說的操作,建立下一頁page對象嘁捷,與這一頁鏈表連接完成后造成,新page的next指針被初始化在棧底(begin的位置),然后繼續(xù)向棧頂添加新對象雄嚣。

所以晒屎,向一個對象發(fā)送- autorelease消息,就是將這個對象加入到當前AutoreleasePoolPage的棧頂next指針指向的位置

釋放時刻

每當進行一次objc_autoreleasePoolPush調用時缓升,runtime向當前的AutoreleasePoolPage中add進一個哨兵對象鼓鲁,值為0(也就是個nil),那么這一個page就變成了下面的樣子:

objc_autoreleasePoolPush的返回值正是這個哨兵對象的地址港谊,被objc_autoreleasePoolPop(哨兵對象)作為入?yún)⒑Э裕谑牵?/p>

1.根據(jù)傳入的哨兵對象地址找到哨兵對象所處的page

2.在當前page中,將晚于哨兵對象插入的所有autorelease對象都發(fā)送一次- release消息歧寺,并向回移動next指針到正確位置

3.補充2:從最新加入的對象一直向前清理燥狰,可以向前跨越若干個page,直到哨兵所在的page(在一個page中成福,是從高地址向低地址清理)

剛才的objc_autoreleasePoolPop執(zhí)行后碾局,最終變成了下面的樣子:

嵌套的AutoreleasePool

知道了上面的原理,嵌套的AutoreleasePool就非常簡單了奴艾,pop的時候總會釋放到上次push的位置為止,多層的pool就是多個哨兵對象而已内斯,就像剝洋蔥一樣蕴潦,每次一層像啼,互不影響。


更多:iOS面試題合集

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末潭苞,一起剝皮案震驚了整個濱河市忽冻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌此疹,老刑警劉巖僧诚,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝗碎,居然都是意外死亡湖笨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門蹦骑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慈省,“玉大人,你說我怎么就攤上這事眠菇”甙埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵捎废,是天一觀的道長笑窜。 經(jīng)常有香客問我,道長登疗,這世上最難降的妖魔是什么排截? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谜叹,結果婚禮上匾寝,老公的妹妹穿的比我還像新娘。我一直安慰自己荷腊,他們只是感情好艳悔,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著女仰,像睡著了一般猜年。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疾忍,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天乔外,我揣著相機與錄音,去河邊找鬼一罩。 笑死杨幼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播差购,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼四瘫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欲逃?” 一聲冷哼從身側響起找蜜,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稳析,沒想到半個月后洗做,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡彰居,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年诚纸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裕菠。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡咬清,死狀恐怖,靈堂內的尸體忽然破棺而出奴潘,到底是詐尸還是另有隱情旧烧,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布画髓,位于F島的核電站掘剪,受9級特大地震影響,放射性物質發(fā)生泄漏奈虾。R本人自食惡果不足惜夺谁,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肉微。 院中可真熱鬧匾鸥,春花似錦、人聲如沸碉纳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳曹。三九已至奴愉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铁孵,已是汗流浹背锭硼。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜕劝,地道東北人檀头。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓轰异,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳖擒。 傳聞我的和親對象是個殘疾皇子溉浙,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355