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 内存警告,可能要终止程序


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容