AutoreleasePool是另一個與RunLoop相關討論較多的話題螃征。其實從RunLoop源代碼分析,AutoreleasePool與RunLoop并沒有直接的關系街夭,之所以將兩個話題放到一起討論最主要的原因是因為在iOS應用啟動后會注冊兩個Observer管理和維護AutoreleasePool陪每。不妨在應用程序剛剛啟動時打印currentRunLoop可以看到系統(tǒng)默認注冊了很多個Observer,其中有兩個Observer的callout都是**?_?wrapRunLoopWithAutoreleasePoolHandler**闸天,這兩個是和自動釋放池相關的兩個監(jiān)聽。
第一個Observer會監(jiān)聽RunLoop的進入斜做,它會回調objc_autoreleasePoolPush()向當前的AutoreleasePoolPage增加一個哨兵對象標志創(chuàng)建自動釋放池苞氮。這個Observer的order是-2147483647優(yōu)先級最高,確保發(fā)生在所有回調操作之前瓤逼。
第二個Observer會監(jiān)聽RunLoop的進入休眠和即將退出RunLoop兩種狀態(tài)笼吟,在即將進入休眠時會調用objc_autoreleasePoolPop()?和?objc_autoreleasePoolPush()?根據情況從最新加入的對象一直往前清理直到遇到哨兵對象。而在即將退出RunLoop時會調用objc_autoreleasePoolPop()?釋放自動自動釋放池內對象抛姑。這個Observer的order是2147483647赞厕,優(yōu)先級最低,確保發(fā)生在所有回調操作之后定硝。
主線程的其他操作通常均在這個AutoreleasePool之內(main函數中)皿桑,以盡可能減少內存維護操作(當然你如果需要顯式釋放【例如循環(huán)】時可以自己創(chuàng)建AutoreleasePool否則一般不需要自己創(chuàng)建)。