1、当用app图标后,ios层负责app沙盒路径及启参数等信息传递给main.m,在main()初始化一个全局的内存自动释放池,并调用UIAppliationMain()生成惟一的UIApplication对象。这个对象就负责管理app的生命周期和系统事件(和硬件接口、用户行为交互)。
2、从UIApplication.h我们可以看到
 
// 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 *principalClassName,NSString *delegateClassName);
 
mac 似乎非常推崇代理模式。网上查了下pricipalClassName,应该是应用本身,也就是说按常理来讲UIApplication的职责应该由这个pricipalClassName指定的对象来履行。但是mac没有这样做,而是使用了代理模式,用第四个参数 delegateClassName来代理应用本身来干活,使用聚合而非继承。如果还不是清楚,试想下董事长任命一个总经理来经营公司。pricipalClassName代表的就是应用的董事长。而delegateClassName就是代表的总经理。
 
3 UIApplication同时会从app沙盒路径里的yourapp info.plist读取首先应该加载的xib,默认情况下是main.xib。加载成功后会初始化文件内部预先定义后的元素对象,比如UIWindow,比如view-based模板下的自定义UIViewController对象或者navigation-based模板下的UINavigationController对象。这里注意到一点main.xib中的对象通过class对象初始化在ApplicationDelegate里定义的Controller对象。
 
4 、现在再来看看这些controller对象被激活后会根据指定的nibname加载匹配的customview.xib文件从而讲ui展示到UIWindow中。这里注意显示在UIWindow中的view,应该处于当前views堆栈的最顶层。
5 、每个view负责自身和子view的绘制。
6 UIApplication将循环事件(一大堆)委托给ApplicationDelegate来处理。