iOS四大对象之AppDelegate及UIApplicationMain函数/程序启动过程1. AppDelegate应用程序代理2. UIApplicationMain函数/程序启动过程

1. AppDelegate应用程序代理

  • 手机上的App有一个致命的缺点:很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止。
  • 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。作用:当被打断的时候,通知代理进入到后台。 默认创建出来,有七个方法,解读如下:
// 程序第一次加载完毕,就会调用此方法
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

// 程序将要失去焦点 - 不能交互
- (void)applicationWillResignActive:(UIApplication*)application

// 程序已经进入后台,通常我们会在这个时候保存数据
- (void)applicationDidEnterBackground:(UIApplication*)application

// 程序将要进入前台,通常我们会在这个时候恢复数据
- (void)applicationWillEnterForeground:(UIApplication*)application

// 程序已经获取焦点 - 可以交互
- (void)applicationDidBecomeActive:(UIApplication*)application

// 程序挂了,将要完全退出。注意:1.用户主动关闭 2.系统因为内存不够关闭了程序。
//这个里面最好不要做任何东西,因为很多时候都会是异常退出。不执行这个。
- (void)applicationWillTerminate:(UIApplication*)application

// 程序接收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

2. UIApplicationMain函数/程序启动过程

  • main函数中执行了一个UIApplicationMain这个函数
intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

2.1 启动参数解释

  • argc 系统传入参数的个数
  • agrv 系统传入参数的值列表
  • principalClassName表示要创建的应用程序对象(app的象征,该类必须是UIApplication或者它的字类)。如果传nil默认就表示UIApplication类。
  • delegateClassName表示 给应用程序指定一个代理对象,该类必须遵守UIApplicationDelegate协议

2.2 启动过程

Paste_Image.png

  • UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性
  • 接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)
  • 程序正常退出时UIApplicationMain函数才返回

Paste_Image.png

1.3 完整启动过程

  1. main函数
  2. UIApplicationMain
  • 创建UIApplication对象
  • 创建UIApplication的delegate对象
  1. delegate对象开始处理(监听)系统事件(没有storyboard)
    • 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
    • 在application:didFinishLaunchingWithOptions:中创建UIWindow
    • 创建和设置UIWindow的rootViewController
    • 显示窗口
  2. 根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
  • 创建UIWindow
  • 创建和设置UIWindow的rootViewController
  • 显示窗口

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS开发日记

iOS开发系列——第一个iOS程序和运行过程

这里我想强调一下,前面的知识是你日后开发IOS的基础,没有那些知识你开发IOS会很痛苦,现在很多开发人员做开发都是一知半解,程序质量确实令人担忧,所以还是希望大...

4006
来自专栏iOS开发攻城狮的集散地

Url Scheme实现APP间通信、分享

接下来就以我之前写的UIActivityViewController系统原生分享-仿简书分享和iOS开源小项目-WSL两个Demo为例,让我们看下怎么可以让UI...

2388
来自专栏娱乐心理测试

iOS 如何把图片资源打包成bundle文件及遇到的坑(详解)

(1.)"Base SDK" 设置为 "Latest iOS (iOS 11.2)" (Xcode 9.2为例)

1582
来自专栏一“技”之长

iOS网络编程之四——请求类NSURLRequest使用详解

        在前面几篇博客中,介绍了iOS开发中的网络编程相关内容并且介绍了常用了两个平行的网络框架NSURLSession和NSURLConnection...

722
来自专栏Guangdong Qi

iOS 9 UIWebView不能加载百度和控制电池条字体颜色

今天写了一个UIWebView给H5的妹子测试,本来很简单的东西,不应该出错的,但是还是有错,而且还是两个

702
来自专栏哈雷彗星撞地球

(译)openURL 在 iOS10中已弃用

翻译自:openURL Deprecated in iOS10 译者:Haley_Wong

751
来自专栏進无尽的文章

基础篇-应用之间的跳转

在应用A跳转到应用B,则给A、B自身自定义URL Schemes(自定义的协议头)后,通过在A中处理B的URL Schemes,就可以在A中启动B了。

1311
来自专栏一“技”之长

iOS网络编程之五——请求回执类NSURLResponse属性简介

        NSURLResponse类中存放请求的回执信息,在发送网络请求时,如果请求成功,首先会接收到服务端的回执信息,直接开始接收具体的返回数据。NS...

773
来自专栏進无尽的文章

基础篇-UIApplication、UIWindow以及程序的启动流程看我就够了

这篇文章主要介绍下有关UIApplication、UIWindow以及程序的启动流程,通过这篇文章,相信你会更加理解iOS 的应用启动过程以及app应用级别的相...

1012
来自专栏xx_Cc的学习总结专栏

iOS-控制器View的创建和生命周期

3186

扫码关注云+社区