iOS面试系列之生命周期(对象的生命周期、Controller的视图对象生命周期、APP生命周期)

对象的生命周期


对象生命周期(Object life cycle)

在OC中一个对象的生命周期就是指,这个对象从创建到销毁的运行时(runtime)的生命。

一个对象的出现方式:

1、创建并初始化对象;

2、对象作为另一个对象的副本的时候;

3、unArchiving的时候,当被要求从已归档的二进制数据流中解码的时候;

(这里要注意,如果一个对象是从一个nib文件中被unArchive的话,在所有的nib文件中的对象都被装载到内存之后,就会收到一个名叫 awakeFromNib 的消息。)

过程如图所示:

在对象的创建和初始化之后,只要对象的retainCount的值比0大,那么它就会一直存在内存中。通过向一个对象发送retain消息,或者进行copy操作。其他对象可以引用并持有该对象的所有权。同时,移除引用的时候发送release消息。



Controller的视图对象生命周期


 [ViewController initWithCoder:]或[ViewController initWithNibName:Bundle]:首先从归档文件中加载UIViewController对象。即使是纯代码,也会把nil作为参数传给后者。

 [UIView awakeFromNib]:作为第一个方法的助手,方法处理一些额外的设置。

 [ViewController loadView]:创建或加载一个view并把它赋值给UIViewController的view属性。

 -[ViewController viewDidLoad]: 此时整个视图层次已经放到内存中,可以移除一些视图,修改约束,加载数据等。

 [ViewController viewWillAppear:]:视图加载完成,并即将显示在屏幕上。还没设置动画,可以改变当前屏幕方向或状态栏的风格等。

 [ViewController viewWillLayoutSubviews]:即将开始子视图位置布局。

 [ViewController viewDidLayoutSubviews]:用于通知视图的位置布局已经完成。

 [ViewController viewDidAppear:]:视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。

 [ViewController viewWillDisappear:]:视图即将消失。

 [ViewController viewDidDisappear:]:视图已经消失。

 [ViewController dealloc:]:视图销毁的时候调用。


APP生命周期


APP启动分为两种:

1、冷启动:从零开始启动APP。

2、热启动:APP已经在内存中,在后台存活着,再次点击图标启动APP。

APP启动三大阶段

一、dyld,Apple的动态链接器,可以用来装载Mach-O文件(可执行文件、动态库等);

 启动APP时,dyld所做的事情有

 1.装载APP的可执行文件,同时会递归加载所有依赖的动态库;

 2.当dyld把可执行文件、动态库都装载完毕后,会通知Runtime进行下一步的处理;

二、runtime

 runtime所做的事情有

 1.调用map_images进行可执行文件内容的解析和处理;

 2.在load_images中调用call_load_methods,调用所有Class和Category的+load方法;

 3.进行各种objc结构的初始化(注册Objc类 、初始化类对象等等);

 4.调用C++静态初始化器和__attribute__((constructor))修饰的函数;

 到此为止,可执行文件和动态库中所有的符号(Class,Protocol,Selector,IMP,…)都已经按格式成功加载到内存中,被runtime 所管理;

 三、main

 1.APP的启动由dyld主导,将可执行文件加载到内存,顺便加载所有依赖的动态库;

 2.并由runtime负责加载成objc定义的结构;

 3.所有初始化工作结束后,dyld就会调用main函数;

 4.接下来就是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法;

重点介绍一下main函数之后要调用的方法

app程序启动过程

1 执行main函数

2 在此方法中调用UIApplicationMain

2.1 创建UIApplication对象

2.2 创建UIApplication的delegate对象

2.3 开启消息循环

3 delegate对象开始监听系统事件

3.1 app启动完成后会调用delegate对象的程序加载完成方法

3.2 如果app的plist设置了main storyboard 会创建UIWindow对象(如果没有设置则不创建)

3.3 创建main storyboard中绑定的controller对象(stroyboard中箭 头指向的控制器)

 3.4 设置给window对象的rootViewController

 3.5 设置window对象可见

app程序执行过程的五大状态

 ios app有5种状态,分别是:

 1、Not running未运行:app没启动或被系统终止。

 2、Inactive未激活:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

 3、Active激活:当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。

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

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

iOS app 程序执行过程及AppDelegate相关事件代理方法

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 程序加载完毕

 - (void)applicationWillResignActive:(UIApplication *)application 程序失去焦点

 - (void)applicationDidEnterBackground:(UIApplication *)application 程序进入后台

 - (void)applicationWillEnterForeground:(UIApplication *)application 程序从后台回到前台

 - (void)applicationDidBecomeActive:(UIApplication *)application 程序获取焦点

 - (void)applicationWillTerminate:(UIApplication *)application 程序即将退出

 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 内存警告,可能要终止程序


你可能感兴趣的:(iOS面试系列之生命周期(对象的生命周期、Controller的视图对象生命周期、APP生命周期))