IOS 生命周期-view和uiviewcontroller的生命周期

参考自滚滚猫的《iOS APP生命周期 和 UIViewController的生命周期》,沧州宁少的《iOS App生命周期》。

1.如果创建视图对象使用的是[[MyViewController alloc] init],执行顺序是init->viewDidLoad,但如果我在MyViewController.m中重写了init,并且在init方法中写入了涉及视图(self.view等)属性的代码,就会在该处暂停init的执行,而去执行viewDidLoad,然后再回来执行init,(注意viewDidLoad在视图生命周期中只执行一次),所以不要再重写的init中加入视图相关代码。

 

APP的生命周期:

一:应用的五种状态

1.未运行(Not running)状态:程序没启动。

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

一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

3.激活(Active):程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。

4.后台(Backgroud):程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。

5.挂起(Suspended):程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

二:函数执行顺序

1.首先执行的是main.m类中的main函数。

这个函数的主要作用是创建一个UIApplication对象,创建它对应的一个代理对象,开启RunLoop运行循环,如果UIStoryBoard存在的话,则从UIStoryBoard中加载用户界面。

在应用程序启动的时候,UIApplication会初始化一些核心对象,并启动运行。UIApplication对象是每个iOS的核心对象。负责帮助iOS系统和其他对象之间的交互.列表列举一下每个对象,UIApplication 管理事件循环和高层组件的行为,负责完成iOS系统和我们定义对象的交互。UIAppdelegate 监听Application中各种状态,Documents和Data Objects 数据模型对象存储应用的内容,针对特定应用的。

UIViewController 视图管理器管理应用程序内容在屏幕上的显示。视图控制器管理着一个根视图和一个子视图的集合。视图控制器通过把视图View安装到UIWindow上以展示在屏幕上。UIViewController是所有视图控制器的基类。封装了类似屏幕旋转。视图展示等一些列的操作。

UIWindow 窗口对象UIWindow。协调屏幕上一个或者多个视图的展示。 大多数应用只有一个窗口。有一些应用有更多的窗口。但应用程序可能额外的窗口,用于在有外接显示器上显示内容。窗口内容从来不会被替换。屏幕内容的改变都是通过视图控制器来完成的。除了管理视图。窗口对象和UIApplication传递事件到UIView和CALayer.

UIView/CALayer  视图和控件提供可视化的展示。层对象实际上是代表视觉内容的数据对象,视图会大量的使用层对象来控制内容。

 

 

 

主运行循环

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

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

 

 

 

 

 

 

 

2.然后依次执行:

application:willFinishLaunchingWithOptions:

在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复。

application:didFinishLaunchingWithOptions:

表示App将从未运行状态进入运行状态,用于对App的初始化操作。

applicationDidBecomeActive:

当应用即将进入前台运行时调用。

applicationWillResignActive:

当应用即将进从前台退出时调用。

applicationDidEnterBackground:

当应用开始在后台运行的时候调用。

applicationWillEnterForeground:

当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用。

applicationWillTerminate:

当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。

 

 

状态转换

三:一些APP的生命周期的场景

1、程序启动:状态由Not running -> Inactive -> Active

willFinishLaunchingWithOptions

didFinishLaunchingWithOptions

applicationDidBecomeActive

2、点击home键|锁屏:由Active -> Inactive -> Backgroud

applicationWillResignActive

applicationDidEnterBackground

3、重新进入前台:Backgroud -> Inactive -> Active 

applicationWillEnterForeground

applicationDidBecomeActive

4、在前台,双击home键,手动杀掉APP:Active -> Inactive -> Backgroud -> end

applicationWillResignActive

applicationDidEnterBackground

applicationWillTerminate

5、当URL到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL

application:didFinishLaunchingWithOptions:

application:openURL:sourceApplication:

applicationDidBecomeActive

6、当URL到达时,如果你的应用正在background运行或被suspended,它将会被移到前台以打开URL

applicationWillEnterForeground

application:openURL:sourceApplication:

applicationDidBecomeActive

 

一个比较全面生命周期执行流程图:

 

 

生命周期执行流程

UIViewController的生命周期:

编译时:

+(void)load

只要类所在文件被引用就会被调用,方法只会被调用一次。

+(void)initialize

类或者其子类的第一个方法被调用前调用,方法只会被调用一次。

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序

1、 alloc

创建对象,分配空间

2、init (initWithNibName|initWithCoder)

初始化对象,初始化数据

3、awakeFromNib

所有视图的outlet和action已经连接,但还没有被确定。

4、loadView

完成一些关键view的初始化工作,加载view。

5、viewDidLoad

载入完成,可以进行自定义数据以及动态创建其他控件

6、viewWillAppear

视图将出现在屏幕之前

7、viewWillLayoutSubviews

将要对子视图进行调整

8、viewDidLayoutSubviews

对子视图进行调整完毕

9、viewDidAppear

视图已在屏幕上渲染完成

10、viewWillDisappear

视图将被从屏幕上移除

11、viewDidDisappear

视图已经被从屏幕上移除

12、dealloc

视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

13、didReceiveMemoryWarning

内存警告

 

 

 

 

 

 

IOS APP启动时间

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值