单例UIApplication-总结

If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.

UIKIT_EXTERN int UIApplicationMain (

   int argc, 
   char *argv[], 
   NSString * __nullable principalClassName, 
   NSString * __nullable delegateClassName
);

那么UIApplicationMain函数到底做了哪些事情呢?这个函数主要负责 三件 事情:

1)从给定的类名初始化应用程序对象,也就是初始化UIApplication或者子类对象的一个实例,
如果你在这里给定的是nil,那么 系统会默认UIApplication类,也就主要是这个类来控制以及协调应用程序的运行。
在后续的工作中,你可以用静态方法sharedApplication 来获取应用程序的句柄。 
2)从给定的应用程序委托类,初始化一个应用程序委托。并把该委托设置为应用程序的委托,这里就有如果传入参数为nil,会调用函数访问 Info.plist文件来寻找主nib文件,获取应用程序委托。 
3)启动主事件循环,并开始接收事件。

UIApplication(或 者子类)对象的职责,这个对象主要做下面几件事:

1)负责处理到来的用户事件,并分发事件消息到应该处理该消息的目标对象(sender,  action)。 
2)管理以及控制视图,包括呈现、控制行为、当前显示视图等。 
3)该对象有一个应用程序委托对象,当一些生命周期内重要事件(可以包括系统事件或者生命周期控制事件)发生时,应用程序通知该对象。
例如,应用程序启动、内存不够了或者应用程序结束等,让这些事件发生时,应用程序委托去响应。 

我们可以从应用程序的单例类对象中得到应用程序委托的对象

UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate]; 

UIApplication 接收到所有的系统事件和生命周期事件时,都会把事件传递给UIApplicationDelegate进行处理,
对于用户输入 事件,则传递给相应的目标对象去处理

创建UIApplication对象并指定其代理

通过UIApplicationMain函数创建UIApplication对象并 指定其代理对象AppDelegate;第三个参数为指定 UIApplication的子类来生成UIApplication对象,为nil时由 UIApplication类初始化默认对象;第四个参数为指定代理 对象。

UIApplication的代理对象

作为UIApplication的代理类,必须要先实现 UIApplicationDelegate协议,协议里明确了作为代理应 该做或可以做哪些事情。 UIApplication对象负责监听应用程序的生命周期事件, 并将生命周期事件交由UIApplication代理对象处理。