两者仿佛并没有直接的关系,查看runloop源码执行的过程中也并未出现过autoreleasepool相关的逻辑。
但是如果打印[NSRunLoop currentRunLoop]
NSLog(@"%@",[NSRunLoop currentRunLoop]);
会发现runloop中注册了两个与autoreleasepool相关的通知
<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>
)}}
第一个监听的是activities 是 NSRunLoopEntry状态,说明当runloop进入entry状态的时候,会调用_wrapRunLoopWithAutoreleasePoolHandler
,其内部会调用_objc_autoreleasePoolPush()创建自动释放池。
第二个监听的activities是 NSRunLoopBeforeWaiting 和NSRunLoopExit,BeforeWaiting 其回调方法_wrapRunLoopWithAutoreleasePoolHandler内部会调用先调用pop操作,然后再push 创建一个新的自动释放池。Exit会调用pop操作。
顺序就是Entry-->push ---> BeforeWaiting--->pop-->push -->Exit-->pop,按照这样的顺便,保证了,没一次push都对应一个pop。
autoreleasepool释放操作在每一次runloop 的BeforeWaiting和exit的时候执行的