天天看點

IOS之自動釋放池淺析

         最近在網上看了一些IOS關于AutoReleasePool的文章,有些心得,在這裡記錄一下,如果有不對的地方或者是疏漏的地方,敬請路過的大神予以指正.

首先一個結構體與AutoReleasePool相關,該結構體有一個構造函數,一個析構函數,以及一個void指針,用于接收構造函數的傳回指針以及析構函數相應的操作.檢視構造函數,會發現裡面的代碼涉及到一個AutoReleasePoolPage對象,構造函數執行了Page類的push操作,析構函數執行了Page類的pop操作.一個AutoReleasePool是由若幹的PoolPage組成的雙向連結清單,其中Page類中包含了一個next指針,指向該page中最新添加的autorelease對象的下一個位置,初識時指向begin(),包含一個thread指針,指向其所在的線程,還包括parent,child指針,分别指向前後page元素.

當執行page::push(),系統會把一個哨兵對象POOL_SENTINEL對象壓入自動釋放池的棧頂,然後傳回存放哨兵對象的位址。插入哨兵對象時,會擷取hotPage,當hotpage存在并且沒滿,就把哨兵對象的位址寫入hotpage的next指向的位置,如果hotpage滿了,則建立一個page,如果沒有hotpage則也建立一個page.

當有一個autorelease對象插入自動釋放池時,page同樣執行push操作,隻不過此時push的是對象位址而不是哨兵對象。當執行pop操作時,page裡每一個對象都會收到release消息。