`
hunxiejun
  • 浏览: 1149294 次
文章分类
社区版块
存档分类
最新评论

Cocoa基本原理指南之九 - 为Cocoa添加行为

 
阅读更多

摘自:http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/chapter_1_section_1.html

使用Objective-C框架中的类及其方法和使用一个C函数库不同。使用C函数库时,您可以根据程序的具体需求灵活选择使用什么函数及何时使用。但是另一方面,框架可以将一种设计加入到您的程序,或者至少加入到您的程序需要解决的某个问题空间中。在面向过程的程序中,您在必要时调用库函数来完成程序需要完成的工作;使用框架时,您也必须调用框架的方法来完成程序中的很多工作,但您还需要对框架进行定制,即实现框架在合适的时候需要调用的方法,使其适合您的需要。那些方法是一种钩子,将您的代码加入到框架实现的程序结构中,为其增加您的程序需要的行为。在某种意义上,通常理解的程序和库的作用被反过来了,不是将库的代码结合到您的程序中,而是将您的程序代码结合到框架中。

在一个复杂的Objective-C程序中,main函数的工作相当简单,由两个步骤组成:

<!--[if !supportLists]-->§ <!--[endif]-->建立一个核心的对象组

<!--[if !supportLists]-->§ <!--[endif]-->将程序的控制权转交给那些对象

在程序运行时,核心组的对象可能会创建其它对象。有些时候,程序也可能装载类,装载归档了的实例,连接远程的对象,以及寻找需要的资源。但在开始时,需要的是一个足以处理程序初始任务的结构即一个够用的对象网络。main函数将这个初始结构建立起来,并使它们为即将到来的工作做好准备。

典型情况下,核心对象中应该有一个是负责监视程序或控制其输入的对象。在核心结构准备好了之后,main函数会启动监视对象的工作。如果程序是一个命令行工具或后台运行的服务器,这个步骤承担的工作可能是简单地传递命令行参数或打开一个远程连接。但是最常见的Cocoa程序类型是应用程序,这种情况下,main函数需要参与更多的工作。

对于应用程序,main函数建立的核心对象组必须包含一些描画用户界面的对象。当用户启动应用程序时,用户界面,或者至少是用户界面的一部分(比如应用程序菜单)必须出现在屏幕上。一旦初始的用户界面被显示在屏幕上,应用程序随即就由外部的事件驱动了,最重要的是那些由用户发起的外部事件:比如点击一个按键,选择一个菜单项,拖拽一个图标,在输入域中键入等等。每个这样的事件都和很多用户动作发生的环境信息一起,报告给应用程序比如哪个键被按下,是否有鼠标被按下或释放,光标的位置在哪里,以及哪个窗口受到影响等。

应用程序获取一个事件,对其进行查看并做出响应(经常是通过描画部分的用户界面),然后等待下一个事件。如果事件由用户或某些其它的事件源(比如定时器)发起,应用程序就会逐个地进行获取。从启动到终止运行,应用程序所做的几乎所有事情,都由用户动作驱动,形式上表现为事件。

事件的获取和响应机制就是主事件循环(称为主循环是因为应用程序可以为某个短暂的时间段建立从属的事件循环)。事件循环本质上是一个带有一个或多个输入源的运行循环。核心组中的一个对象负责运行主事件循环获取事件,并将事件派发给最适合的一个或多个对象,然后获取下一个事件。在Cocoa应用程序中,这个负责协调的对象就是全局的应用程序对象,即NSApplication类的一个实例。1显示了就是这个主事件循环。

1主事件循环

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="图片_x0020_53" o:spid="_x0000_i1025" type="#_x0000_t75" alt="The main event loop" style='width:290.25pt;height:137.25pt;visibility:visible; mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/ThinkPad/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" o:title="The main event loop" /> </v:shape><![endif]--><!--[if !vml]-->The main event loop<!--[endif]-->

在几乎所有的Cocoa应用程序中,main函数都是极为简单的,因为它只有一个函数调用(参见列表3-1)。NSApplicationMain函数的作用是创建一个应用程序对象,建立一个自动回收池,从主nib文件中装载初始的用户界面,以及将应用程序运行起来,使其开始处理主循环接收到的事件。

列表3-1Cocoa应用程序中的main函数

#import <AppKit/AppKit.h>
int main(int argc, const char *argv[]) {
 return NSApplicationMain(argc, argv);
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics