App啟動后似将,蘋果在主線程 RunLoop 里注冊了兩個 Observer太抓,其回調都是 _wrapRunLoopWithAutoreleasePoolHandler()。
第一個 Observer 監(jiān)視的事件是 Entry(即將進入Loop)罪塔,其回調內會調用 _objc_autoreleasePoolPush() 創(chuàng)建自動釋放池漓摩。其 order 是 -2147483647,優(yōu)先級最高膊爪,保證創(chuàng)建釋放池發(fā)生在其他所有回調之前自阱。
第二個 Observer 監(jiān)視了兩個事件: BeforeWaiting(準備進入休眠) 時調用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 釋放舊的池并創(chuàng)建新池;Exit(即將退出Loop) 時調用 _objc_autoreleasePoolPop() 來釋放自動釋放池米酬。這個 Observer 的 order 是 2147483647沛豌,優(yōu)先級最低,保證其釋放池子發(fā)生在其他所有回調之后赃额。
在主線程執(zhí)行的代碼加派,通常是寫在諸如事件回調、Timer回調內的跳芳。這些回調會被 RunLoop 創(chuàng)建好的 AutoreleasePool 環(huán)繞著芍锦,所以不會出現(xiàn)內存泄漏,開發(fā)者也不必顯示創(chuàng)建 Pool 了飞盆。