美文网首页
VC的生命周期

VC的生命周期

作者: nothing_c | 来源:发表于2016-10-31 23:19 被阅读112次

    UIViewController是IOS程序中的一个重要组成部分,扮演者一个大管家的身份,管理着程序中的众多视图: 何时加载view,加载的原则是什么,视图何时消失等问题,文档中讲的都很详细。

    Controller的view最好在需要显示时再去加载,并且在系统发出内存警告时释放不必要的view及相关的可再生的数据对象。

    一、UIViewController的初始化

    初始化时会根据需要调用init,initWithCoder等相关函数,这个时候我们可以做一下简单的初始化操作,建立ViewController中需要使用的数据模型等,不建议在初始化阶段就直接创建view及其他与显示有关的对象(应该放到loadView的时候去创建,或者采用懒加载的方法创建)。

    我们都知道ViewController可以通过代码和xib两种方式创建,这两种方式的初始化流程也不尽相同。

    1)使用xib创建的VC

    xib其实最终是会把我们的设置保存成一个数据集(xml文件),当需要初始化构建VC的时候,回去读取记录的数据集,然后帮我们动态的创建VC,因此可以想象它在初始化时会先去找看是否实现initWithCoder方法,如果该类实现了该方法,就直接调用initWithCoder方法创建对象,如果没有实现的话就调用init方法。调用完初始化方法以后紧接着会调用awakeFromNib方法,在这个方法里面我们可以做进一步的初始化操作。

    2)使用代码创建VC

    使用代码创建时,我们根据需要手动的创建VC中的数据,如果自己定制VC时,还需要在init中调用[super init]。

    二、UIViewController中View的load和unload

    前面讲了不建议在VC初始化的时候就创建view及其他与显示相关的代码,官方文档建议将View的初始化操作放到loadView的时候再做,当VC接到内存告警时会调用didRecieveMemoryWarning这个时候我们就要做出响应,释放暂时不需要的对象。如果无视这个警告,系统内存不够用时会会继续发送,如果还得不到处理就会强制退出程序。下面看具体的loadView和unloadView时候都会做什么操作。

    1)Load周期

    Pasted Graphic.tiff

    当需要显示或者访问view属性时,view没有创建的话,VC就会调用loadView方法,在这个时候会创建一个view并将其赋给VC.view属性。紧接着就会调用VC的viewDidLoad方法,这个时候VC.view保证是有值的,可以做进一步的初始化操作,例如添加一些subview。注意:定制VC时,如果覆盖loadView方法,不需要调用[super loadView]方法。

    使用代码创建VC

    当无针对view的操作时

    [self.window makeKeyAndVisible];
    [AppDelegate application:didFinishLaunchingWithOptions:]
    //自定义初始化
    [TestVC init]
    //初始化对象
    [AppDelegate application:didFinishLaunchingWithOptions:]
    //viewdidload
    [TestVC viewDidLoad]
    //设置成为根视图
    [AppDelegate application:didFinishLaunchingWithOptions:]

    当有针对view的操作时(在viewDidLoad中)

    [AppDelegate application:didFinishLaunchingWithOptions:]
    [TestVC init]
    [AppDelegate application:didFinishLaunchingWithOptions:]
    [TestVC viewDidLoad]
    [AppDelegate application:didFinishLaunchingWithOptions:]

    当有针对view的操作时(在init中)

    [AppDelegate application:didFinishLaunchingWithOptions:]
    [TestVC init]
    [TestVC viewDidLoad]
    [AppDelegate application:didFinishLaunchingWithOptions:]
    [AppDelegate application:didFinishLaunchingWithOptions:]

    //有xib或者storyboard才会调用这两个方法

    - (void)awakeFromNib{

    NSLog(@">>>>>>%s",__func__);

    }

    //自定义初始化

    - (id)init{
    self= [super init];
    if(self) {
    NSLog(@"555>>>>%s",__func__);
    self.view.backgroundColor= [UIColor redColor];
    }
    return self;
    }

    //系统内部实现的,一般情况下不会手动调用;如果调用的话,需要自定义self.view

    - (void)loadView{

    self.view = [[UIView alloc] init];

    }

    //使用到的时候才会调用viewdidload(懒加载的原理)

    - (void)viewDidLoad {

    [super viewDidLoad];

    NSLog(@"444>>>>%s",__func__);

    }

    相关文章

      网友评论

          本文标题:VC的生命周期

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