在 C 系语言中,程序的入口都是 main函数。对于一个 Objective-C 的 iOS app 项目,在新建项目时,Xcode 将帮我们准备好一个 main.m文件,其中就有这个 main函数:
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
在这里我们调用了 UIKit
的 UIApplicationMain
方法。
这个方法将根据第三个参数初始化一个 UIApplication
或其子类的对象
并开始接收事件 (在这个例子中传入nil
,意味使用默认的UIApplication
)。
最后一个参数指定了 AppDelegate
类作为应用的委托,它被用来接收类似 didFinishLaunching
或者didEnterBackground
这样的与应用生命周期相关的委托方法。另外,虽然这个方法标明为返回一个int
,但是其实它并不会真正返回。它会一直存在于内存中,直到用户或者系统将其强制终止。
开发中,我们可以替换这个,然后在自己的文件AppController
下实现这些方法didFinishLaunching
或者 didEnterBackground
这样的与应用生命周期相关的委托方法
。也是没问题的。
main主要做了三件事情:
1、创建一个自动释放池
2、调用UIApplicationMain
函数
3、释放自动释放池
UIApplicationMain函数作用
1、创建一个应用程序,创建应用程序代理
2、建立一个事件循环来捕捉处理用户的行为
什么是UIApplication?
1、一个iOS程序启动后
创建的第一个对象就是UIApplication
对象
2、每一个程序在运行期必须有且仅有一个UIApplication
(或则其子类)的一个实例。创建UIApplication
的单例实例,实现可以通过调用[UIApplication sharedApplication]
来得到这个单例实例的指针
3、利用UIApplication
对象,能进行一些应用级别的操作
[[UIApplication sharedApplication]applicationState] 获取程序状态
[[UIApplication sharedApplication]applicationIconBadgeNumber]小红点个数
4、处理用户事件,它会起一个队列,把所有用户事件都放入队列,逐个处理,在处理的时候,它会发送当前事件到一个合适的处理事件的目标控件。
5、维护一个在本应用中打开的window
列表(UIWindow
实例,这样它就可以接触应用中的任何一个UIView
对象。UIApplication
实例会被赋予一个代理对象,以处理应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告)等等
UIApplication继承自UIResponder,的主要作用: 提供了iOS程序运行期间
的控制和协作工作,每个iOS程序运行期间
都会有一个UIApplication
实例,一般由main函数
的UIApplicationMain函数
完成,而在代码中可以调用[UIApplication sharedApplication]方法
来得到这个实例(有且仅有一个),比如可以利用它判断程序状态
:
if([UIApplication sharedApplication].applicationState ==UIApplicationStateInactive){
NSLog(@"程序在运行状态");
}
新建一个任意类型的iOS应用工程
,在AppDelegate.h
中会看到
AppDelegate :UIResponder <UIApplicationDelegate>
即本类
实现(采纳)了一个名叫UIApplicationDelegate
的接口,且表明AppDelegate
这个类就是这个工程中UIApplication
实例的代理类。
看看main
函数:
int main(int argc, char *argv[]){
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
这里传入了代理类到UIApplicationMain函数
中,UIApplicationMain函数
在生成唯一一个UIApplication
的时候就可以把代理类的实例指针告诉这个单例对象
了。
网友评论