view的多一些理解
viewcontrol
ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调。
在IOS中,有两类ViewController,一类是显示内容的,比如UIViewController、UITableViewController等,同时还可以自定义继承自UIViewController的ViewController;另一类是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewController,UITabBarController是以Array的形式来管理ViewController。
view的加载
个人在参考一些别人的blog之后,感觉controller之下控制的view,就是就可以比作一个老式投影仪,view是一个内容卡片,controll需要将卡片放上去才能在屏幕之上显示出view的内容。
平时我们创建一个view有两个途径
1.使用代码
2.使用可视化
就是在这幅图里面,我有种感觉就是说,viewcontroller控制view,其实也是用指针方式指向一个view,使得当前viewcontroller能够显示一个view出来,然后我就突然想到了老式投影仪一样。
view的卸载
从图中可以看到,当系统发出内存警告时,会调用didReceiveMemoeryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,至此,view就被卸载了。此时原本指向view的变量要被置为nil,具体操作是在viewDidUnload方法中调用self.view = nil;
小结一下:
loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。
**注意**
1.不要在loadView中调用父类方法[super loadView],因为这会影响CPU性能。
2.切换前后台不会调用viewWillAppear
viewcontroller的生命周期
上面说到像老式投影仪,按照这样的对比,viewcontroller的生命周期其实也很好理解。首先需要有一台投影仪嘛(alloc肯定接着init,布偶过这里接着是initWithNibName),然后就需要把片子(就是view),放入到投影仪里面(loadview),但是这里没有viewWillUnload和viewDidUnload,原因?就是被抛弃了咯,哈哈。然后剩下就是比较熟悉的viewwillappear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc。dealloc在arc里面或者没有那么明显,因为当一个对象的retain count变为0的时候,就会去调用这个dealloc方法,将对象的内存回收。