iOS程序生命周期详解、

前言

iOS系统的资源是有限的,程序运行在前台或者后台,各个状态的切换,消耗的资源和体验感也是不同的。

在后台时程序会受到系统的很多限制。掌握程序生命周期,合理进行资源调配,这样才能保证程序的性能和使用平滑,对于提高用户体验是非常重要的。


【一】应用有五种状态:

1、Not Running 【未运行状态】:程序没有启动,未运行。

2、Inactive【未激活状态】:程序在前台运行,不过没有接收到事件。

3、Active【激活状态】:程序在前台运行,并且接收到事件,并处理中。这也是前台的一个正常的模式

4、Background【后台状态】:程序进入后台且能够执行代码,大多数程序进入这个状态之后会停留一会。时间到了会自动进入Suspended状态,有的程序经过特殊请求后可长期处于Background状态。附:iOS后台长时间执行程序案例

5、Suspended【挂起状态】:进入后台,不能执行代码,系统会自动把程序编程该状态且不会发出通知,当挂起的时候,程序还是停留在内存中,当系统内存低的时候,就会把该程序清理掉,为前台程序提供更多的内存。


【二】函数执行

1、启动程序的方法有两种:

a.点击点击桌面应用图标 

b.通过程序Url(比如在Safari地址栏中输入应用程序url)

2、首先执行的是main.m类中的main函数

iOS程序生命周期详解、_第1张图片

intUIApplicationMain(intargc,char*argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);

第一个参数 argc 和 第二个参数 argv 为C语言的值,在这里可以不做考虑。

第三个参数 principalClassName:主程序类名,由英文注释可知,当值为 nil 时,默认使用的就是 UIApplication

第四个参数:delegateClassName:代理类名,在 iOS 中默认就是随工程一起创建出来的AppDelegate。

流程解析:

执行UIapplicationMain函数、

创建一个UIApplication对象,设置它对应的一个代理和相应的代理属性、

开启RunLoop主运行循环,监听系统事件、

监测info。plist文件,如果UIStoryBoard存在的话,则从UIStoryBoard中加载用户界面。

如果存在StoryBoard:

加载Main.StoryBoard

在StoryBoard上面创建一个UIwindow,

设置Window的根控制器

遍历控制器上面的所有子控件,没有则创建对应的控件

如果不存在StoryBoard:

通过一个强引用创建UIWindow

设置Window的frame为屏幕的bounds

设置window的根控制器

将window作为主窗口并且显示到界面上

【三】补充知识


iOS程序生命周期详解、_第2张图片


1、UIApplication简述

UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序,单例(有且仅有一个)。

一个iOS程序启动后创建的第一个对象就是UIApplication对象。

UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作。

它的基类是UIResponder(意味着可以响应事件)主要工作是处理用户事件,它会维护一个串行队列,把所有用户事件都放入队列,逐个处理、

利用UIApplication对象,能进行一些应用级别的操作。例:设置角标,打电话,跳转设置等、

2、UIWindow简述

窗口对象UIWindow。协调屏幕上一个或多个视图的展示。

它相当于一个画板,UIView则是一块画布,UIView在UIWindow上,其他的控件就相当于一幅画中的各个元素(object)。

3、UIViewController简述

视图控制器.从名字我可以知道它是一个控制器并且是控制视图的。

屏幕内容的改变也业务逻辑处理。

view作为该类的一个属性被安装到UIWindow上以展示在屏幕上。

4、UIView简述

视图.用来展示界面。

UIButton 、UIImageView、等

【四】主运行循环


iOS程序生命周期详解、_第3张图片

应用程序的运行循环处理所有与用户相关的事件。UIApplication对象在应用启动的时候运行循环,用来处理事件和视图更新。顾名思义,各种事件在主运行循环串行执行。保证了执行的先后顺序。

用户和设备交互的事件是由操作系统产生的。这些事件发生到UIKit会建立一个端口。事件会在一个事件队列中排序,逐个分发。一个触摸(Touch)事件通常先分发到主窗口对象,然后依次分发到触摸事件发生的视图。但是这些事件并非是通过主循环进行分发。有些时事件发生到代理对象和函数对象中。iOS中主要的事件类型包括:触摸事件,远程控制事件,摇晃事件,加速器事件,定位。


【四】状态变化


iOS程序生命周期详解、_第4张图片

1、点击桌面应用图标/Url方式开启应用

Not Running -> Inactive -> Active  

2、点击Home键

如果可以在后台运行或者挂起会经历

Active-->Inactive-->Background-->Suspended

如果不可以后台运行或挂起会经历 

Active-->Inactive-->Background-->Suspended-->Not Running

3、挂起后,重新运行

Suspended-->Background-->Inactive-->Active

4、内存不足,杀死程序

Background-->Suspended-->Not running

这种情况不会调用任何方法,也不会发送任何通知。



你可能感兴趣的:(iOS程序生命周期详解、)