对象的生命周期
对象生命周期(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 内存警告,可能要终止程序