兩者仿佛并沒有直接的關(guān)系历恐,查看runloop源碼執(zhí)行的過程中也并未出現(xiàn)過autoreleasepool相關(guān)的邏輯葵腹。
但是如果打印[NSRunLoop currentRunLoop]
NSLog(@"%@",[NSRunLoop currentRunLoop]);
會發(fā)現(xiàn)runloop中注冊了兩個與autoreleasepool相關(guān)的通知
<CFRunLoopObserver 0x600001d145a0 [0x7fff80617cb0]>{
valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647,
callout = _wrapRunLoopWithAutoreleasePoolHandler (0x7fff4808bf54),
context = <CFArray 0x6000022454a0 [0x7fff80617cb0]>{
type = mutable-small, count = 1, values = (
0 : <0x7fabae001038>
)}}
<CFRunLoopObserver 0x600001d14640 [0x7fff80617cb0]>{
valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647,
callout = _wrapRunLoopWithAutoreleasePoolHandler (0x7fff4808bf54), context = <CFArray 0x6000022454a0 [0x7fff80617cb0]>{
type = mutable-small, count = 1, values = (
0 : <0x7fabae001038>
)}}
第一個監(jiān)聽的是activities 是 NSRunLoopEntry狀態(tài),說明當(dāng)runloop進(jìn)入entry狀態(tài)的時候方库,會調(diào)用_wrapRunLoopWithAutoreleasePoolHandler
,其內(nèi)部會調(diào)用_objc_autoreleasePoolPush()創(chuàng)建自動釋放池。
第二個監(jiān)聽的activities是 NSRunLoopBeforeWaiting 和NSRunLoopExit陡舅,BeforeWaiting 其回調(diào)方法_wrapRunLoopWithAutoreleasePoolHandler內(nèi)部會調(diào)用先調(diào)用pop操作,然后再push 創(chuàng)建一個新的自動釋放池伴挚。Exit會調(diào)用pop操作靶衍。
順序就是Entry-->push ---> BeforeWaiting--->pop-->push -->Exit-->pop,按照這樣的順便茎芋,保證了颅眶,沒一次push都對應(yīng)一個pop。
autoreleasepool釋放操作在每一次runloop 的BeforeWaiting和exit的時候執(zhí)行的