5 苹果开发人员技术文档连载之-系统架构( 八 )



当设备驱动程序所控制的输入设备(例如:鼠标或键盘)探测到一个用户动作时,会触发一个低级事件 。在Mac OS X中,由构成所有设备驱动程序基础的I/O Kit来创建事件,并把它们放入视窗服务器的事件队列中(对视窗服务器的探讨参见“Quartz Compositor”) 。这个队列被放置在由I/O Kit和视窗服务器所共享使用的内存块中 。一旦I/O Kit把一个事件放入队列中,它就通过Mach进程间通讯机制(IPC)通知视窗服务器 。

这时,视窗服务器把事件从队列中取出,并查询当前打开窗口的数据库 。视窗服务器再把事件发送到隶属于一个特定进程的运行循环的事件端口中,而该特定进程拥有事件发生所在窗口的所有权 。Carbon事件管理器从运行循环端口获得事件,以合适的形式把事件打包,发送给特定的应用程序环境下的该进程的事件处理机制 。这种机制确保了事件可由所点击控件(或按键)的相关函数和方法来进行处理 。

事件处理机制对于每个应用程序环境都是不同的:

·Carbon Carbon具有几种供应用程序来处理事件的机制 。主要的机制是使用EventRefs,这种隐含的低级事件结构 。EventRefs的处理程序被安装在用户界面对象上(包括人性化接口工具箱的默认对象),这些处理程序自动接收全部或部分指定到这些对象上的事件 。处理程序可以忽略事件、处理事件或把它传递给外围容器内的下一个处理程序 。事件处理使用DefProc消息,并且可以使用函数回调 。

·Cocoa 在Cocoa中,事件作为NSEvent对象被打包 。该对象被送到能负责对一个应用进程进行全面管理的应用程序对象中 。应用程序对象把NSEvent对象转发给事件发生所在窗口的第一响应程序(first-responder)视图 。通过顺次响应程序(next-responder)机制,如果事件没有被处理的话,事件对象将在窗口视图中被逐级传送,直到它到达应用程序对象自身 。如果事件与一个用户界面控件所关联,它的典型处理方式是通过一个称为“目标动作(target-action)”的机制来进行的 。

·Java 在Java中事件处理是通过java.awt.Event和java.awt.Component类来实现的 。

推荐阅读