1.AutoreleasePool
应用启动后,程序会注册两个Observer观察:_wrapRunLoopWithAutoreleasePoolHandler
->即将进入runloop(调用objc_autoreleasePoolPush()为当前呢page添加哨兵对象)
->即将进入休眠(先调用objc_autoreleasePoolPop() release autorelease对象,再调用objc_autoreleasePoolPush()为当前page添加新的哨兵对象),退出runloop(调用objc_autoreleasePoolPop()释放自动释放池)
2.UI绘制
应用启动后,程序会注册一个Observer观察:_ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv
->即将今年入睡眠,当views的frame发生改变,或视图的层级发生变化时等,这些view会被标记为待处理,并被加入到一个全局的容器中,当runloop即将进入睡眠时,回调这个observer回调,查找有没有需要更新的views,若有则进行绘制(所以当view.frame发生变化时,会在下一个runloop周期内绘制)
3.手势识别
苹果注册了一个observer观察:_UIGestureRecognizerUpdateObserver()
->即将进入睡眠,当用户触摸屏幕时,首先IOKit.framework会产生一个IOHIDEvent事件,并由springboard接收,springboard通过mach port转发给应用进程,触发runloop的source1回调,并调用_UIApplicationHandleEventQueue() 进行应用内部分发。_UIApplicationHandleEventQueue() 若识别这是一个手势,首先会调用 cancel 将当前的 touchesBegin/Move/End 回调打断。随后系统将对应的 UIGestureRecognize 标记为待处理。runloop 即将进入睡眠时,获取所有待处理的 gesture,并执行其回调
-
网友评论