目录:
一、iOS启动过程
二、Controller和View的生命周期三、UIView生命周期
四、总结
带不带xib的vc和view都是可以继承的,只不过父类中的视图结构复杂的话子类可定制的余地很低,更多的只是在某个空白的子view上添加视图,或者是对原视图中的元素进行更多的控制。
一、iOS启动过程
流程说明如下:
1、程序入口
进入main函数,设置AppDelegate称为函数的代理
2、程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:]
3、创建window窗口
4、程序被激活
[AppDelegate applicationDidBecomeActive:]
5、当点击command+H时(针对模拟器,手机是当点击home键)
程序取消激活状态
[AppDelegate applicationWillResignActive:];
程序进入后台
[AppDelegate applicationDidEnterBackground:];
6、点击进入工程
程序进入前台
[AppDelegate applicationWillEnterForeground:]
程序被激活
[AppDelegate applicationDidBecomeActive:];
注意事项:
1、UIApplicationMain 函数解释
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
1.argc和argv参数是为了与C语言保持一致,在这没用到,不详述。
2.后面两个参数为principalClassName(主要类名)和delegateClassName(委托类名)。
(1)如果principalClassName是nil,那么它的值将从Info.plist中获取,如果Info.plist中没有,则默认为UIApplication。principalClass这个类除了管理整个程序的生命周期之外什么都不做,它只负责监听事件然后交给delegateClass去做。
(2)delegateClass将在工程新建时实例化一个对象。NSStringFromClass([AppDelegate class]) //相当于@"AppDelegate"
2、对于applicationWillResignActive(非活动)与applicationDidEnterBackground(后台)这两个的区别。
(1)applicationWillResignActive(非活动):
比如当有电话进来或短信进来,在或者锁屏等,这时你的应用程序挂起进入非活动状态,也就是你的手机其实界面还是显示着你当前的App窗口,只不过被别的任务强制占用了,或者后台状态(因为要先进入非活动状态,然后进入后台)。
(2)applicationDidEnterBackground(后台):
指当前窗口不是你的App,大多数程序进入这个后台后会在在这个状态上停留一会,时间到之后会进入挂起状态(Suspended)。如果你程序特殊处理后可以长期处于后台状态即在后台状态也可以运行。Suspended(挂起):程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
二、Controller和View的生命周期
ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
1. init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要调用self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2. loadView时view还没有生成,其作用是初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。其过程如下图:
关于loadView方法的重写,官方文档中有一个明显的注释,意思是:当通过代码方式去创建你自己的view时,在loadView方法中不应该调用super,如果调用[super loadView]会影响CPU性能。
3、 viewDidLoad 时view已经生成,最适合创建一些附加的view和控件了。
4、 viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、 viewDidAppear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6、 viewDidUnload 这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。
7、 接下来看看ViewController中的view是如何被卸载的:当系统发出内存警告时,会调用didReceiveMemoeryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,至此,view就被卸载了。此时原本指向view的变量要被置为nil,具体操作是在viewDidUnload方法中调用self.myButton = nil;
三、UIView生命周期
UIView生命周期相对简单,需从“用XIB加载UIView”和“用代码加载UIView”两方面来说明。
1、用XIB加载UIView
初始化代码:
XibView *xibView = [[[NSBundle mainBundle]loadNibNamed:@"XIBView" owner:self options:nil] lastObject];
[self.view addSubview:xibView];
此时执行的初始化函数顺序为:initWithCoder、awakeFromNib
我的理解:用XIB加载UIView其加载可以放到UIView的initWithFrame函数中,这样对外就可以以“用代码加载UIView”的方式初始化UIView。
2、用代码加载UIView
CodeView *codeView = [[CodeView alloc]init];
codeView.frame = CGRectMake(0, 500, 100, 50);
[self.view addSubview:codeView];
此时执行的初始化函数顺序为:initWithFrame、 init
四、总结
带不带xib的vc和view都是可以继承的,只不过父类中的视图结构复杂的话子类可定制的余地很低,更多的只是在某个空白的子view上添加视图,或者是对原视图中的元素进行更多的控制。