iOS AutoReleasePool底層實現- AutoreleasePoolPage的push和pop

//***********push方法***********
void *
objc_autoreleasePoolPush(void)
{
return AutoreleasePoolPage::push();
}

//***********pop方法***********
void
objc_autoreleasePoolPop(void *ctxt)
{
AutoreleasePoolPage::pop(ctxt);
}

從定義中發現AutoreleasePoolPage繼承自AutoreleasePoolPageData
從AutoreleasePoolPageData的定義中發現了parent和child,
這代表AutoreleasePoolPageData是一個雙向鏈表,其內存大小爲56字節

AutoreleasePool原理
自動釋放池本質是一個AutoreleasePoolPage結構體對象,棧結構存儲,每一個AutoreleasePoolPage以雙向鏈表形式連接
自動釋放的壓棧和出棧本質上是調用AutoreleasePoolPage的push和pop方法
push 壓棧
判斷hotPage是否存在
不存在,autoreleaseNoPage創建新hotPage,調用add方法將對象添加至page棧中
存在滿了,autoreleaseFullPage初始新的page
存在沒滿,調用add方法將對象添加到page的next指針,next指針++
pop 出棧
執行pop出棧時,會傳入push操作的返回值,即POOL_BOUNDARY的內存地址token,根據token找到哨兵對象所在,並釋放之前的對象,next指針--
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章