应用程序的生命周期是由发生在程序启动到终止期间的一系列的事件构成的。在iPhone OS中,用户可以通过轻点Home屏幕上的图标来启动应用程序。在轻点图标之后的不久,系统就会显示一个过渡图形,然后调用相应的main函数来启动应用程序。从这个点之后,大量的初始化工作就会交给UIKit,由它装载应用程序的用户界面和准备事件循环。在事件循环过程中,UIKit会将事件分发给您的定制对象及响应应用程序发出的命令。当用户进行退出应用程序的操作时,UIKit会通知应用程序,并开始应用程序的终止过程。
在iPhone的应用程序中,main函数仅在最小程度上被使用,应用程序运行所需的大多数实际工作是由UIApplicationMain函数来处理。因此,每个工程模板都会提供一个mian函数的标准实现,main函数只做三件事:
1.创建一个自动释放池,
2.调用UIApplicationMain函数
3.使用自动释放池。
除了少数的例外,您永远不应该改变这个main函数的实现。iPhone应用程序的mian函数程序清单如下:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
请注意:自动释放池用语内存管理,它是Cocoa的一种机制,用于延缓释放具有一定功能的代码块中创建的对象。
上述程序清单的核心代码是UIApplicationMain函数,它接收四个参数,并将他们用于初始化应用程序。
传递给该函数的缺省值并不需要修改,但是它们对于应用程序的启动的作用还是值得解释一下。除了传给main函数的argc和argv之外,该函数还需要两个字符串参数,用于标识应用程序的首要类(即应用程序对象所属的类)和应用程序委托类。
如果首要类字符串的值为nil,UIKit就缺省使用UIApplication类;如果应用程序委托类为nil,UIKit就会将应用程序主nib文件(此处是针对通过Xcode模板创建的应用程序)中的某个对象假定为应用程序的委托对象。
如果您将这些参数设置为废nil值,则在应用程序启动时,UIApplicationMain函数会创建一个与传入值相对应的类的实例,并将它用于既定的目的。因此,如果您的应用程序使用了UIApplication类的定制子类(这种做法是不推荐的,但是确实是可能的),就需要在第三个餐宿制定该定制类的类名。
应用程序的委托
监控应用程序的高级行为是应用程序委托对象的职责,而应用程序委托对象是你提供的定制类实例,委托是一种避免对复杂的UIKit对象(比如缺省的UIApplication对象)进行子类化的机制。在这种机制下,您可以不进行子类化和方法重载,而是将自己的定制代码放到委托对象中,从而避免对复杂对象进行修改,当您感兴趣的事件发生时,复杂对象会将消息发送给您定制的委托对象。您可以通过这种“挂钩”执行自己的定制代码,实现需要的行为。
重要提示:
委托模式的目的是使您在常见应用程序的时候省时省力,因此是非常重要的设计模式。应用程序的委托对象负责处理几个关键的系统消息。每个IPhone应用程序都必须有gxu应用程序委托对象,它可以是您希望的任何类的实例,但需要遵循UIApplicationDelegate协议,该协议的方法定义了应用程序生命周期的某些挂钩,您可以通过这些方法来实现定制的行为。