美文网首页
iOS面试系列之生命周期(对象的生命周期、Controller的

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

作者: Buger123 | 来源:发表于2020-11-17 21:22 被阅读0次

    对象的生命周期


    对象生命周期(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的

          本文链接:https://www.haomeiwen.com/subject/zseuxktx.html