根据以上两张图片来看,app的启动过程以下:微信
一、打开app,调用main函数app
二、main调用UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))ide
第三个参数nil:表明UIApplication类名或者子类名称,nil 至关于 @"UIApplicaiton"
;
第四个参数:表明UIApplicaiton的代理名称NSStringFromClass([AppDelegate class] 至关于 @"AppDelegate"
;函数
2.一、UIApplicationMain建立UIApplication对象,AppDelegate对象(UIApplication的代理)oop
2.二、UIApplication开启运行循环(Main Runloop)ui
注:UiApplication表明一个应用程序,每个应用程序都有一个UIApplication全局对象(单例),咱们在程序中能够经过[UIApplication sharedApplication]
得到这个对象,进行一些应用级的操做。UIApplication负责监听接收事件,而由UIApplicationDelegate决定应用程序如何去响应这些事件(生命周期:程序启动和关闭,系统事件:来电、记事项警告)等等。spa
2.三、加载info.plist,判断是否指定mian(xib或者storyboard)若是指定就去加载代理
三、UIApplicationDelegate对象开始处理监听到的事件(code
程序启动成功以后,首先调用application:didFinishLaunchingWithOptions:方法,
若是info.plist文件中配置了启动storyboard文件名,则加载storyboard文件。
若是没有配置,则根据代码来建立UIWindow--->UIWindow的rootViewController-->显示)对象
info.plist文件:
Localiztion native development region | CFBundleDevelopmentRegion 本地化相关,若是用户所在地没有相应的语言资源,则用这个key的value来做为默认 |
Executaule file | CFBundleExecutable 程序安装包的名称 |
Bundle name | CFBundleDisplayName 设置程序安装后显示的名称。应用程序名称限制在10-12个字符,若是超出,将被显示缩写名称 |
Bundle identifier | CFBundleIdentifier APP的惟一标识字符串。 |
InfoDictionary version | CFBundleInfoDictionaryVersion Info.plist格式的版本信息 |
Bundle OS Type code | CFBundlePackageType 用来标识束类型的四个字母长的代码(目前没用到过,还不清楚怎么用) |
Bundle versions string, short | CFBundleShortVersionString 版本字符串(版本号) |
Bundle version | CFBundleVersion 构建版本号,每次上传以后须要增长 |
Application require iPhone environment | LSRequiresIPhoneOS:用于指示程序包是否只能运行在iPhone OS 系统上。Xcode自动加入这个键,并将它的值设置为true。您不该该改变这个键的值。 |
supported interface orientations | UISupportedInterfaceOrientations 程序默认支持的方向。 |
APPdelegate中状态改变调用的方法:
// 程序 开始运行 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } // 程序 挂起(有电话进来 或者 锁屏(拉下状态栏、双击Home键使App界面上移) 的时候) - (void)applicationWillResignActive:(UIApplication *)application { } // 程序 进入后台 - (void)applicationDidEnterBackground:(UIApplication *)application { } // 程序 进入前台 - (void)applicationWillEnterForeground:(UIApplication *)application { } // 程序 从新激活(复原)注意:应用程序在启动时,在调用了“applicationDidFinishLaunching”方法以后 一样也会 调用“applicationDidBecomeActive”方法! - (void)applicationDidBecomeActive:(UIApplication *)application { } // 程序 终止(注:若是点击主按钮强制退出,则不会调用该方法。) - (void)applicationWillTerminate:(UIApplication *)application { }
实际使用中碰到的几个场景: