欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

深入iPhone开发:应用程序核心探秘(1)(3)

来源: 开发者 投稿于  被查看 18490 次 评论:207

事件处理循环

当UIApplicationMain 函数初始化了应用程序之后,它起动必要的基础组件来管理这个应用程序的事件和绘制循环,这在图Figure 1-2中描述。当用户和设备交互时,iPhone OS 侦测触摸事件并把它们放到应用程序事件队列中。UIApplication对象的事件处理组件从事件队列顶部提取每个事件并递交给最合适的对象来处理它。比如,一个发生在一个按钮上的触摸事件将会被递交给相应的按钮对象。事件也可以被递交给控制器对象controller objects)和其他不是直接负责处理该触摸事件的对象。

图1-2  事件和绘画循环 
图 1-2  事件和绘画循环

在iPhone OS 多点触摸事件模型中,触摸数据被包装在一个简单的事件对象中(UIEvent)。为了跟踪单独的触摸动作,事件对象中包含了触摸对象(UITouch),每一个代表一个手指触摸了屏幕。当这个用户把手指放在屏幕上,并四处移动它们,最后从屏幕上移开,系统会在相应的触摸对象中报告每个手指的变化。

当应用程序启动时,系统为这个应用程序创建一个进程和线程。这个初始线程成为应用程序主线程, UIApplication 对象就在这里建立主运行循环main run loop)并配置应用程序的事件处理编码。图1-3 显示了事件处理编码和主运行循环之间的关系。系统发送的触摸事件被排队直到它们能被应用程序的主循环处理。

在主运行循环中处理事件 
图1-3  在主运行循环中处理事件

注意: 一个运行循环监控一个给定的执行线程的输入源。当一个输入源有数据处理时,这个运行循环唤醒线程并把控制权派发给输入源处理器。当处理完成时,控制权返回运行循环,继续下一个事件或者如果没有什么事情做的话就让这个线程休眠。你可以安装你自己的输入源,包括端口和时钟,在一个运行循环中使用基础框架中的NSRunLoop 类。

UIApplication用一个输入源对象配置主运行循环来处理触摸事件,把它们分发给合适的响应者对象。一个响应者对象是从UIResponder 类继承而来并且实现了一个或多个处理触摸事件不同阶段的方法。应用程序中的响应者对象包括UIApplication实例,UIWindow,UIView,和所有UIView子类。 应用程序通常分发事件给代表应用程序的主窗口的UIWindow 对象。这个窗口对象,依次,转发这个事件给它的第一响应者first responder,这通常是发生触摸事件的视图对象(UIView)。

除了定义处理事件的方法之外,UIResponder类还定义了响应者链的程序结构,这是一个协同事件处理的Cocoa机制。响应者链是应用程序中的一个响应者对象连接序列,通常从第一响应者开始。如果第一响应者对象不能处理这个事件,它传递给响应链中的下一个。这个消息继续回溯响应链-给更高级别的响应者对象比如窗口,应用程序,和应用程序代理-直到事件被处理。如果事件最终仍然未被处理,则被抛弃。

处理事件的响应者对象倾向于在移动中设置一系列程序动作而导致应用程序重画所有或它的用户界面的一部分以及其它可能的输出,比如播放声音)。例如,一个控制器对象 也就是,一个UIControl子类),通过发送一个动作消息给另外一个对象来处理一个事件,通常这个控制器管理着当前激活视图集。当处理当前消息时,这个控制器可能改变用户界面或者调整视图位置,需要部分视图重新绘制自己。当这个发生时,视图和绘图基础组件接管并以可能的最有效率的方式来处理这些必要的重绘事件。

基本设计模式

UIKit框架的设计融合了许多Mac OS X上的Cocoa应用程序创建的设计模式。理解这些模式对于创建iPhone应用程序是关键的,所以值得花一些时间来了解它们。下面提供了一个这些设计模式的总体描述:

基本设计模式


用户评论