前言
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函数
![](https://img.haomeiwen.com/i6545546/b8f07179469a9b90.png)
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作为主窗口并且显示到界面上
【三】补充知识
![](https://img.haomeiwen.com/i6545546/e1c20874e97e6342.png)
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、等
【四】主运行循环
![](https://img.haomeiwen.com/i6545546/f9295b6d9fed4271.png)
应用程序的运行循环处理所有与用户相关的事件。UIApplication对象在应用启动的时候运行循环,用来处理事件和视图更新。顾名思义,各种事件在主运行循环串行执行。保证了执行的先后顺序。
用户和设备交互的事件是由操作系统产生的。这些事件发生到UIKit会建立一个端口。事件会在一个事件队列中排序,逐个分发。一个触摸(Touch)事件通常先分发到主窗口对象,然后依次分发到触摸事件发生的视图。但是这些事件并非是通过主循环进行分发。有些时事件发生到代理对象和函数对象中。iOS中主要的事件类型包括:触摸事件,远程控制事件,摇晃事件,加速器事件,定位。
【四】状态变化
![](https://img.haomeiwen.com/i6545546/8a9251bc9afd1f04.png)
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
这种情况不会调用任何方法,也不会发送任何通知。
网友评论