应用程序过程控制器生命周期以及main函数之前的过程
Posted xingxiaoxiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用程序过程控制器生命周期以及main函数之前的过程相关的知识,希望对你有一定的参考价值。
应用程序的生命周期
1.程序入口
进入main函数,设置Appdelegate为代理函数
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))
2.程序加载完成
进入- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
3.程序进入激活状态
[AppDelegate applicationDidBecomeActive:]
4.双击home进入非活状态(还有电话进来或锁屏该情况下,当前的应用程序被别的任务强制占用了)
[AppDelegate applicationWillResignActive:]
5.如果进入后台
先进入非活状态[AppDelegate applicationWillResignActive:]
再进入后台[AppDelegate applicationDidEnterBackground]
6.程序进入前台(在后台不能执行代码,当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存)
先进入前台[AppDelegate applicationWillEnterForeground]
再进入活动状态[AppDelegate applicationDidBecomeActive:]
7.程序被杀死
[AppDelegate applicationWillTerminate:];
控制器的生命周期
1.ios中初始化(init)对象时,会调用对象的init方法,进入init方法时会调用initWithNibName方法,也就是 init方法会默认调用initWithNibName.(xib或者不是xib都调用),执行关键数据初始化操作,注意: 不要在这里做View相关操作,View在loadView方法中才初始化
2.如果是xib,连接了串联图storyBoard,调用initWithCoder,.awakeFromNib,xib加载完毕,所有视图的outlet和action已经连接,但还没有被确定,这个方法可以算作适合视图控制器的实例化配合一起使用的,因为有些需要根据用户喜好来进行设置的内容,无法存在storyBoard或xib中,所以可以在awakeFromNib方法中被加载进来。
3.loadView,控制器的view还没创建,可以再这里面。设置view,假设我们在处理内存警告时释放view属性:self.view = nil。因此loadView方法在视图控制器的生命周期内可能被调用多次,loadView方法不应该直接被调用,而是由系统调用,注意:在重写loadView方法的时候,不要调用父类的方法
3.viewDidLoad,控制器自带的view已经创建完毕,一般在这里创建子控件
4.viewWillAppear,视图将要出现
5.viewWillLayoutSubviews,即将创建子控件(一般不用,不过测试没有调用)
6.viewDidLayoutSubviews,已经布局子控件(一般不用,不过测试没有调用)
7.viewDidAppear,视图已经出现
8.viewWillDisappear,视图将要消失
9.viewDidDisappear,视图已经消失
10.didReceiveMemoryWarning,出现内存警告调用
11.dealloc,视图被被销毁
main之前的加载过程
1.app启动时间,main之前的系统dylib(动态链接库)和自身App可执行文件的加载的时间,main之后执行didFinishLaunchingWithOptions:结束前的时间
2、
dyld 开始将程序二进制文件初始化
交由ImageLoader 读取 image,其中包含了我们的类,方法等各种符号(Class、Protocol 、Selector、 IMP)
由于runtime 向dyld 绑定了回调,当image加载到内存后,dyld会通知runtime进行处理
runtime 接手后调用map_images做解析和处理
接下来load_images 中调用call_load_methods方法,遍历所有加载进来的Class,按继承层次依次调用Class的+load和其他Category的+load方法
至此 所有的信息都被加载到内存中
最后dyld调用真正的main函数
注意:dyld会缓存上一次把信息加载内存的缓存,所以第二次比第一次启动快一点
以上是关于应用程序过程控制器生命周期以及main函数之前的过程的主要内容,如果未能解决你的问题,请参考以下文章