UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:。此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:(该方法用来推断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),假设pointInside:withEvent:返回YES。则继续逐级调用。直到找到touch操作发生的位置。这个视图也就是要找的hit-test view。
hitTest:withEvent:方法的处理流程例如以下:首先调用当前视图的pointInside:withEvent:方法推断触摸点是否在当前视图内;若返回NO,则hitTest:withEvent:返回nil;若返回YES,则向当前视图的全部子视图(subviews)发送hitTest:withEvent:消息。全部子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象。处理结束。如全部子视图都返回非。则hitTest:withEvent:方法返回自身(self)。
事件的传递和响应分两个链:
传递链:由系统向离用户近期的view传递。
UIKit –> active app’s event queue –> window –> root view –>……–>lowest view
响应链:由离用户近期的view向系统传递。initial view –> super view –> …..–> view controller –> window –> Application
Run Loop是一让线程能随时处理事件但不退出的机制。
RunLoop 实际上是一个对象。这个对象管理了其须要处理的事件和消息,并提供了一个入口函数来运行Event Loop 的逻辑。线程运行了这个函数后,就会一直处于这个函数内部 "接受消息->等待->处理" 的循环中,直到这个循环结束(比方传入 quit 的消息),函数返回。让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。
OSX/iOS 系统中。提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef。
CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,全部这些 API 都是线程安全的。
NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,可是这些 API 不是线程安全的。
线程和 RunLoop 之间是一一相应的,其关系是保存在一个全局的 Dictionary 里。
线程刚创建时并没有 RunLoop,假设你不主动获取,那它一直都不会有。
RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生程结束时。
你仅仅能在一个线程的内部获取其 RunLoop(主线程除外)。
系统默认注册了5个Mode:
kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其它 Mode 影响。
UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完毕后就不再使用。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76433-3.html
我们为了我们岛礁人员和财产的安全是不是应该扩大南沙岛礁建设的规模及思路