RunLoop 是怎样让autorelease释放的呢?
系统在主线程的RunLoop里注册了两个Observer,回调都是_wrapRunLoopWithAutoreleasePoolHandler,第一个Observer的状态是activities = 0x1,第二个Observer的状态是activities = 0xa0,这两种状态代表什么意思呢?
0x1代表kCFRunLoopEntry, Observer监听的第一个事件Entry (即将进入Loop时)回调内会调用_objc_autoreleasePoolPush()创建一个自动释放池 ,其order优先级是-2147483647, 优先级最高,保证创建自动释放池发生在其他所有回调之前
0xa0代表的是kCFRunLoopBeforeWaiting和kCFRunLoopExit,第二个Observer监听了两个事件:kCFRunLoopBeforeWaiting准备进入休眠,kCFRunLoopExit即将退出RunLoop。在kCFRunLoopBeforeWaiting事件时调用 _objc_autoreleasePoolPop()和_objc_autoreleasePoolPush() 释放旧的自动释放池并创建新的自动释放池;同时这个Observer的order优先级是 2147483647,优先级最低,保证其释放自动释放池的操作发生在其他所有回调之后。
所以在没有手动增加AutoreleasePool的情况下,Autorelease对象都是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池push和pop操作。