标签:
main函数之前的底层环境搭建(代码拷贝、内存的开辟等操作系统相关的开启一个进程)不再描述,我们从main函数开始。
1 main函数
int main(int argc, char * argv[]) { NSLog(@"===%s",argv[0]); @autoreleasepool { /// 函数原型: // int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
这里面的代码一般是不变的。首先是一个自动释放池,保证结束时内存释放,下面是参数介绍:
argc, argv:是标C的参数,argc为argv数组中元素的个数。argv一般有一个元素argv[0]即当前可执行程序的路径。(另外,在linux系统下我们通过终端打开一个程序可以给它传递参数,具体不再展开。如果不知所云括号里面的自动忽略);
principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值,它是一个单例,代表一个进程,也是程序创建的第一个对象,利用UIApplication对象,能进行一些应用级别的操作;
delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议。
2 UIApplicationMain
1)根据传进的参数创建UIApplication对象;
2)根据传进的参数创建UIApplication的delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性。
3)开启一个消息循环
下面分为storyboard启动和没有storyboard启动
##有storyboard##
3 根据Info.plist加载storyboard
1)创建UIWindow,UIWindow是一种特殊的UIView,通常在一个App中只会有一个UIWindow(注意是通常,还有其它的,比如弹出的键盘)。设置为主窗口,同一时刻主窗口只有一个,可以通过[UIApplication sharedApplication].keyWindow获取。
2)创建和设置UIWindow的rootViewController。
3)显示窗口
##没有storyboard##
3 delegate对象开始处理(监听)系统事件(没有storyboard)
1)程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
2)在application:didFinishLaunchingWithOptions:中创建UIWindow:window
3)创建和设置UIWindow的rootViewController
4)显示并设置window为主窗口:[window makeKeyAndVisible]; 然后self.window = window;防止被释放。
标签:
原文地址:http://www.cnblogs.com/mddblog/p/4761245.html