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 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

JavaScript与有限状态机

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 ? 简单说,它有三个特征:   * 状态总数(stat...

3137
来自专栏技术小讲堂

ASP.NET AJAX(1)__Microsoft AJAX LibraryASP.NET AJAX(1)__Microsoft AJAX Library

ASP.NET AJAX(1)__Microsoft AJAX Library Microsoft AJAX Library为我们提供的客户端框架,提供的内容大...

2774
来自专栏娱乐心理测试

一个 JS 库就能解决小程序跨页传递事件消息和数据

由于微信小程序 wx.navigateBack 方法并不支持返回传值,导致页面在返回后,不能方便地即时更新数据。

944
来自专栏枕边书

JavaScript Alert 函数执行顺序问题

问题 ---- 前几天使用 JavaScript 写 HTML 页面时遇到了一个奇怪的问题: 我想实现的功能是通过 confirm() 弹窗让用户选择不同的需求...

2734
来自专栏九彩拼盘的叨叨叨

Vue1.x 写法示例

常见内置过滤器 capitalize, uppercase, lowercase, json, limitBy, filterBy。所有见这里。

783
来自专栏coder修行路

Django进阶之中间件

 中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的...

1978
来自专栏移动端开发

Swift 2.2 协议和代理

一:代理      两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。     比如:控制器(...

18710
来自专栏柠檬先生

zepto 基础知识(6)

101.$.ajax   $.ajax(options) 类型:XMLttpRequest   执行Ajax请求。他可能是本地资源,或者通过支持...

24510
来自专栏马洪彪

SuperSubScriptHelper——Unicode上下标辅助类

在项目的实施过程中,类似化学分子式、平方、立方等,需要处理上、下标字符。 上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化...

32710
来自专栏跟着阿笨一起玩NET

C# SQL多条件查询拼接技巧

本文转载:http://blog.csdn.net/limlimlim/article/details/8638080

661

扫码关注云+社区