提到iOS中VC的生命周期,首先想到的无外乎viewDidLoad、viewWillAppear等方法的调用执行顺序等,当我仔细想了想,这并不是问出这个问题的人真正想要的答案,于是有了这篇思考总结VC生命周期的文章。
从UIViewController说起
官方文档对VC的一句话解释是:管理你的应用程序视图的基础框架。
UIViewController的生命周期
- (instancetype)init;
// initWithNibName 、instantiateViewController(withIdentifier:)(UIStoryboard)
alloc申请内存创建对象后,你可以从storyboard、nib、或者直接init进行初始化。(注:initWithNibName是加载带有xib的控制器,而loadNibNamed是加载一个UIView。)
- (void)loadView; //- (void)loadViewIfNeeded NS_AVAILABLE_IOS(9_0);
当VC初始化完成view将要被展示但为nil时,它会主动调用loadView方法创建或寻找VC的root view(若是使用的xib或sb,loadView会从中加载rootview和其他子view),此时,你可以重写loadView:
[super loadView]; 加上这句,view会按照自己的规则加载,你可以在view加载后对其进行属性修改;若不调用super方法,则需要你手动初始化view,给self.view赋值需求的view如webView、imageView等以便节约内存,而这也是我们重写loadView方法的初衷。
注:重写loadView时不调用super直接self.view会造成死循环。
- (void)viewDidLoad;
VC加载root view到内存中后,将执行此方法,一般我们重写它以便加载额外的初始化视图或者一些必要的初始化数据处理。
- (void)viewWillAppear:(BOOL)animated;
root view加载到内存中后,在添加到window视图结构层次中之前调用。即,view将要显示。可在此处处理一些如状态栏、标题栏颜色、键盘弹出等特殊变化的逻辑。
对于后面的viewDidAppear、viewWillDisappear、viewDidDisappear等就不再赘述,viewWillUnload是非ARC时代的产物,现已遭废弃。最后的dealloc也比较常用,可以监测VC有没有正常释放,是解决内存泄露的重要指标。
注:可利用运行时的class_replaceMethod/method_exchangeImplementations进行统一VC正常释放的统一打印。
至此,关于UIViewController的生命周期问题就总结思考完毕了。最后补个图。
网友评论