美文网首页
UIViewController生命周期

UIViewController生命周期

作者: RyderZhang | 来源:发表于2017-04-17 15:15 被阅读18次
    #import "CodeViewController.h"
    
    /*
     UIViewControl视图控制器:每一个视图控制器都自带一个UIView,是所有视图控制器的父类
     当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
     1、 alloc                                   创建对象,分配空间
     2、 init (initWithNibName使用xib)            初始化对象,初始化数据
     3、 loadView                                从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
     4、 viewDidLoad                             载入完成,可以进行自定义数据以及动态创建其他控件
     5、 viewWillAppear                          视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
     6、 viewDidAppear                           视图已在屏幕上渲染完成
     
     当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
     1、 viewWillDisappear                       视图将被从屏幕上移除之前执行
     2、 viewDidDisappear                        视图已经被从屏幕上移除,用户看不到这个视图了
     3、 dealloc                                 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
     */
    
    
    @interface CodeViewController ()
    
    @end
    
    
    //实现代码:实现可以用runtime,也可以用基类(基类就是父类,派生类就是子类), 
    个人推荐是用基类,但是下面的代码是runtime的。
    @implementation CodeViewController
    
    -(void)loadView {
        [super loadView];
        NSLog(@"%s", __func__);
        
        //loadView 中加上三个方法:
        //1.createFields 接受参数,初始化变量
        if ([self respondsToSelector:@selector(createFields)]) {
            [self performSelector:@selector(createFields)];
        }
        
        //2.createViews 创建视图
        if ([self respondsToSelector:@selector(createViews)]) {
            [self performSelector:@selector(createViews)];
        }
        
        //3.createEvents 绑定事件,如按钮的点击,NotificationCenter,kvo等
        if ([self respondsToSelector:@selector(createEvents)]) {
            [self performSelector:@selector(createEvents)];
        }
        
        //额外
        //1.enterForeground 进入前台时调用
        if ([self respondsToSelector:@selector(enterBackground)]) {
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
        }
        
        //2.enterBackground 进入后台时调用
        if ([self respondsToSelector:@selector(enterForeground)]) {
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
        }
    }
    
    -(void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor redColor];
        NSLog(@"视图加载完毕%s",__FUNCTION__);
        
        /*
         一个APP在载入时会先通过调用loadView方法或者载入IB中创建的初始界面的方法,将视图载入到内存中,然后会调用viewDidLoad方法来进行进一步的设置。
         通常,我们对于各种初始数据的载入,初始设定等很多内容,都会在这个方法中实现,所以这个方法是一个很常用,很重要的方法。
         但是要注意,这个方法只会在APP刚开始加载的时候调用一次,以后都不会再调用它了,所以只能用来做初始设置。
         */
        
        //loadData 加载数据,调用一些api
        if ([self respondsToSelector:@selector(loadData)])
            [self performSelector:@selector(loadData)];
    }
    
    
    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        NSLog(@"视图即将出现%s",__FUNCTION__);
        
        /*
         系统在载入所有数据后,将会在屏幕上显示视图,这时会先调用这个方法。通常我们会利用这个方法,对即将显示的视图做进一步的设置。例如,我们可以利用这个方法来设置设备不同方向时该如何显示。
         另外一方面,当APP有多个视图时,在视图间切换时,并不会再次载入viewDidLoad方法,所以如果在调入视图时,需要对数据做更新,就只能在这个方法内实现了。
         所以这个方法也非常常用。
         */
    }
    -(void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
         NSLog(@"视图已经出现%s",__FUNCTION__);
        
        /*
         有时候,由于一些特殊的原因,我们不能在viewWillApper方法里,对视图进行更新。那么可以重写这个方法,在这里对正在显示的视图进行进一步的设置。
         */
        
    }
    -(void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:animated];
        NSLog(@"视图即将消失%s",__FUNCTION__);
        
        /*
         在视图变换时,当前视图在即将被移除、或者被覆盖时,会调用这个方法进行一些善后的处理和设置。
         由于在IOS4之后,系统允许将APP在后台挂起,所以在按了Home键之后,系统并不会调用这个方法,因为就这个APP本身而言,APP显示的view,仍是挂起时候的view,所以并不会调用这个方法。
         */
        
    }
    -(void)viewDidDisappear:(BOOL)animated{
        [super viewDidDisappear:animated];
        NSLog(@"视图已经消失%s",__FUNCTION__);
        
        /*
         我们可以重写这个方法,对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其他操作。
         */
    }
    -(void)dealloc{
        //ARC下不需要写[super dealloc];
        //MRC下需要写[super dealloc];
        NSLog(@"当前视图控制器被释放%s", __FUNCTION__);
        
        
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        //destroyEvents 取消事件的绑定
        if ([self respondsToSelector:@selector(destroyEvents)])
            [self performSelector:@selector(destroyEvents)];
        //destroyViews 释放,销毁视图
        if ([self respondsToSelector:@selector(destroyViews)])
            [self performSelector:@selector(destroyViews)];
        //destroyFields 释放,销毁引用的变量
        if ([self respondsToSelector:@selector(destroyFields)])
            [self performSelector:@selector(destroyFields)];
        
    }
    
    
    -(void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
         NSLog(@"%s", __func__);
        
        //cleanData 释放一些可以释放的数据
        if ([self isViewLoaded] && [self.view window] == nil) {
            if ([self respondsToSelector:@selector(cleanData)])
                [self performSelector:@selector(cleanData)];
        }
    
    }
    
    //load方法在这个文件被程序装载时调用。
    //只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。
    +(void)load {
        NSLog(@"%s", __func__);
    }
    
    
    //当第一次使用这个类的时候会调用一次
    +(void)initialize {
        NSLog(@"%s", __func__);
    }
    
    
    -(void)viewWillLayoutSubviews{
        NSLog(@"%s", __func__);
    }
    
    -(void)viewDidLayoutSubviews{
        NSLog(@"%s", __func__);
    }
    
    
    @end
    

    推荐两篇博客:
    http://blog.csdn.net/qijianli/article/details/7826979/
    http://www.jianshu.com/p/d60b388b19f5

    相关文章

      网友评论

          本文标题:UIViewController生命周期

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