我的测试收藏iOS开发iOS Developer

ViewController 生命周期

2015-12-23  本文已影响299人  尘絮缘12138

先总的说下调用顺序:

  1. initWithNibName
  2. loadView
  3. viewDidload
  4. viewWillAppear
  5. viewWillLayoutSubviews
  6. viewDidLayoutSubviews
  7. viewDidAppear
  8. viewWillDisappear
  9. viewDidDisappear
  10. dealloc

initWithNibName

- (instancetype)initWithNibName:(NSString *)nibNameOrNil 
                         bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
            self.edgesForExtendedLayout = UIRectEdgeAll;
            self.extendedLayoutIncludesOpaqueBars = YES;
            self.automaticallyAdjustsScrollViewInsets = NO;
        } else {
            self.wantsFullScreenLayout = YES;
        }
    
}
    return self;
    }
}

在这个函数中应该只有相关数据的初始化,而且这些数据都是比较关键的数据,不要出现创建view的代码,也不要调self.view,否则会导致ViewController创建view;View的创建留给后面的方法。当然,如果你是用XIB,可以用这个方法初始化xib文件。如上代码,我设置了些参数,例如* self.automaticallyAdjustsScrollViewInsets = NO;*告诉系统不要对我的scrollview做自适应inset,否则VC的controller会把scrollview顶下来,造成计算偏差.

loadView

loadView 方法是查看你有木没有 xib,有的话就用 xib 加载基本信息,木有的话就会创建一个空白的 UIView,然后把它作为这个 ViewController 的 view.所以之后我们可以在viewDidLoad中调用self.view,并进行自定义操作.一般来说,我们不去重写这个方法,重头戏都放在viewDidLoad中.
关于loadView,他其实是lazy load的,就是懒加载,当显示的调用self.view时,如果你重写了这个方法,那么系统就会调用loadView,调用完后,再自动调用ViewDidLoad函数.这时就有可能造成死循环,这也是我们一般不去重写loadView方法的一个原因.

viewDidLoad

这个时候,view已然加载到了内存中,我们可以随心所欲的添加subView,或者填充数据.最好不要操作self.view。

viewWillAppear

view即将显示,但此时其superView还为nil,即view还没有加到任何其他view中,但准备要添加到其他View中了。

在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色).

viewWillLayoutSubviews

官方文档如下:

When a view’s bounds change, the view adjusts the position of its subviews. Your view controller can override this method to make changes before the view lays out its subviews. The default implementation of this method does nothing.

除了按顺序调用外,当view大小改变时,我们可以在这里调整subview的位置,大小等。不过一般来说,我们在创建subview时会设定其autoresizingMask,由系统帮助我们调整,毕竟人家的方法有硬件的优化

viewDidLayoutSubviews

view已经布局其Subviews。比如view的bounds改变了,已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。例如可以reloadData,或者也可以做layoutSubview的工作。

viewDidAppear

view已经显示,即已经加到其superView中了。view显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码,例如reloadData。

viewWillDisappear

view即将从superView中移除,此时还没有调用removeFromeSuperView。这是可以处理一些小问题,例如显示statusBar.修改子scrollview是否可以滑动等。

viewDidDisappear

view已经从superView中移除了,可以恢复一些控件属性.

dealloc

VC被释放.

需要注意的方法

viewDidUnload(iOS3.0引入,iOS6废弃了该方法)

viewWillUnload(iOS6废弃了该方法)

didReceiveMemoryWarning

内存吃紧时(系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用)。
注意是除当前正在展示的view 所属 viewController 以外所有已经在内存里面的viewController 执行 didReceiveMemoryWarning方法,而不是当前viewController 执行 didReceiveMemoryWarning。

上一篇下一篇

猜你喜欢

热点阅读