iOS - ViewController生命周期

作者: Mitchell | 来源:发表于2015-08-15 16:47 被阅读20882次
    作者:Mitchell 
    

    一、 ARC环境

    • 单个viewController的生命周期
      • initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
      • loadView:加载view
      • viewDidLoad:view加载完毕
      • viewWillAppear:控制器的view将要显示
      • viewWillLayoutSubviews:控制器的view将要布局子控件
      • viewDidLayoutSubviews:控制器的view布局子控件完成
        这期间系统可能会多次调用viewWillLayoutSubviews 、 viewDidLayoutSubviews 俩个方法
      • viewDidAppear:控制器的view完全显示
      • viewWillDisappear:控制器的view即将消失的时候
        这期间系统也会调用viewWillLayoutSubviews 、viewDidLayoutSubviews 两个方法
      • viewDidDisappear:控制器的view完全消失的时候
    • 多个viewControllers跳转
      • 当我们点击push的时候首先会加载下一个界面然后才会调用界面的消失方法
      • initWithCoder:(NSCoder *)aDecoder:ViewController2 (如果用xib创建的情况下)
      • loadView:ViewController2
      • viewDidLoad:ViewController2
      • viewWillDisappear:ViewController1 将要消失
      • viewWillAppear:ViewController2 将要出现
      • viewWillLayoutSubviews ViewController2
      • viewDidLayoutSubviews ViewController2
      • viewWillLayoutSubviews:ViewController1
      • viewDidLayoutSubviews:ViewController1
      • viewDidDisappear:ViewController1 完全消失
      • viewDidAppear:ViewController2 完全出现
    • 小结:
      -整个控制器声明周期: viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear

    二、非ARC环境下

    • didReceiveMemoryWarning:
      • 当app收到内存警告的时候会发消息给视图控制器。
      • app从来不会直接调用这个方法,而是当系统确定可用内存不足的时候采取调用。
      • 如果你想覆写这个方法来释放一些控制器使用的额外内存,你应该在你的实现方法中调用父类的实现方法
    • viewWillUnload:(iOS6废除)
      • 当消除掉控制器的视图之前调用
      • 视图不会再在低内存条件下被清除所以这个方法不会再被调用。
      • 在iOS5之前,当低的内存情况发生的时候,当前控制器的视图们不再被需要的时候,系统会有选择性的将这些视图从这些内存移除。这个方法被调用的目的是在视图被真正的销毁前你可以执行一些清空的任务。比如,你想要使用这个方法去清空视图的观察者或通知或者记录视图的状态以便当重新读取的时候恢复。
      • 在iOS6之后,不再需要清空视图的引用。因此,其他一些关于清理的方法,比如清空观察者,也不是必要的了。
    • viewDidUnload:(iOS6废除)
      • 当视图从内存中被消除后调用
      • 视图在地的内存情况下不再被销毁所以这个方法也不再会调用
      • 在iOS5之前,地的内存状况发生之后,当前的试图控制器的视图不再被需要,系统会选择性的在视图控制器的视图被销毁后调用。这个方法使你执行一些最后清空任务的最后机会如果你的视图控制器存储着对视图的或子控件的单独引用,你应该使用这个方法去释放这些引用。你也可以使用这个方法去消除一些你再创建视图时候所创建的但是当视图不再的时候不再需要的关于对象的引用。你不应该使用这个方法去释放用户数据或者一些不能轻易被重新创建的数据。
      • 在iOS6之后,清空在试图控制器中对views和其他对象的引用已经没有必要了。
      • 当这个方法被调用的时候,视图的属性是空的。

    相关文章

      网友评论

      • 奋斗的蝼蚁:present 情况下又是怎么样的呢
      • shansir:请教楼主,我在tabbar中嵌套的navigation ,通过navigation跳转到二级视图,在二级视图的viewdidload中打印self.view.frame ,输出结果是screenHeight - navigationHeight - statusBarHeight,并没有减掉tabbarHeight,而在viewDidLayoutSubviews 中输出结果正确。所以尝试在viewDidLayoutSubviews 中做一些布局处理,但是看到文章后发现viewDidLayoutSubviews确实会被多次调用,布局操作同样也会被多次调用,所以希望楼主指点一下这个问题。
      • Beyond_JG:xib并不会调用 initWithCoder:(NSCoder *)aDecoder:
        作者应该先验证再发表博客
        牧马: @做一个优秀的程序猿 init方法当然只被调用一次,我是想说没有验证的不是作者,而且写这个评论的人
        xfs_coder:@牧马 貌似initWithCoder 只会被调用一次,而且还有awakefromnib好像也是的
        牧马:@Beyond_JG 你确定?什么环境下
      • b59457960ac9:viewDidLayoutSubviews ViewController2
        viewWillLayoutSubviews:ViewController1
        viewDidLayoutSubviews:ViewController1
        viewDidDisappear:ViewController1 完全消失
        viewDidAppear:ViewController2 完全出现
        你好,对这里有点疑问,想请教下:怎么ViewController1都要消失了还会调用LayoutSubviews呢?
        Mitchell:@Twistar 只能说猜测系统可能在界面将要消失和完全消失之间需要对布局做了一些处理,所以会触发layoutsubviews

      本文标题:iOS - ViewController生命周期

      本文链接:https://www.haomeiwen.com/subject/gdrwqttx.html