美文网首页
12.ViewController的生命周期及其方法介绍

12.ViewController的生命周期及其方法介绍

作者: 小笨憨 | 来源:发表于2017-06-16 10:29 被阅读0次

    ViewControlleriOS开发中MVC模式中的CViewControllerviewControllerViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调。

    分类

    在iOS中,有两类ViewController,一类是显示内容的,比如UIViewControllerUITableViewController等,同时还可以自定义继承自UIViewController;另一类是ViewController容器,UINavigationControllerUITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewControllerUITabBarController是以Array的形式来管理ViewController

    加载过程

    Controller中创建View有两种方法,一种是使用Storyboard等可视化工具,另一种是通过代码创建。
    可视化工具在开发中方便快捷,但是流畅性不如纯代码的方式创建。

    ViewController生命周期

    alloc->initWithNibName->loadView->viewDidLoad->viewWillAppear->viewDidAppear->viewWillDisappear->viewDidDisappear->dealloc
    

    注意viewWillUnloadviewDidUnload已经在iOS6被废弃了,因为Clearing references to views is no longer necessary.
    注意:没有viewWillLoad
    注意:viewDidLoadviewDidUnload并不是成对的。

    程序运行中按下Home键,程序并没有以上方法的触发,但双击Home键,删除该程序将会触发,View Will DisappearView Did Disappear 两个方法。
    为什么按下Home键之后没有调用viewWillDisappearviewDidDisappear呢?
    因为在iOS4后引入了后台的概念,当按下Home键之后,程序被挂起了,但是该View依然是原来的View,并不是新的。所以只有内存不够的时候或程序被终止的时候,才会调用viewWillDisappearviewDidDisappear

    在补全两个布局的方法

    alloc->initWithNibName->loadView->viewDidLoad->viewWillAppear->viewWillLayoutSubviews->viewDidLayoutSubviews->viewDidAppear->viewWillDisappear->viewDidDisappear->dealloc
    

    方法分析

    1.初始化方法:

    // 指定初始化方法
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
      self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
      if (self) {
        // Custom initialization
      }
      return self;
    }
    

    2.loadView方法

    (1)该方法完成了视图控制器的View的创建
    (2)当有特殊需求需要自己创建视图控制器view时,则重写该方法。此方法是默认的。无特殊要求时不用重写。
    (3)当视图控制器的View将要被使用时,系统自动调用该方法进行创建。
    (4)不允许使用super。当[super loadView]在方法中时,则不能创建一个View,则此方法和ViewDidLoad方法会循环执行,直到程序崩溃。
    (5)在loadview中添加的view初始化不用必须添加frame的初值,但是在viewdidload中是必须添加frame的初值的,否则页面只能显示不能触发包括点击和输入。

    - (void) loadView
    {
      // 创建登陆界面
     LoginView *loginView = [[LoginView alloc] init];
     loginView.nameView.textField.delegate = self;
     loginView.passWordView.textField.delegate = self;
     self.view = loginView;
     [loginView release];
     }
    

    3.viewDidLoad方法

    loadView方法执行完成后,view创建之后立即调用,开发者视图创建和其他操作大部分在此方法中添加。
    如果重写方法中代码包含self.view = ???,即重新为其指定view时,不需要调用父类实现[super viewDidLoad];否则,则需要为调用父类实现。

    -(void)viewDidLoad
    {
      [super viewDidLoad];
      // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor redColor];
        //创建登陆界面
        _loginView = [[LoginView alloc] initWithFrame:self.view.bounds];
        _loginView.nameView.textField.delegate = self;
        _loginView.passWordView.textField.delegate = self;
        [self.view addSubview:_loginView];
        [_loginView release];
    }
    

    4.viewWillAppear和viewDidAppear方法

    (1)在View 将要出现和已经出现的时候触发。
    (2)layoutSubviews的方法触发时机在viewWillAppearviewDidAppear方法之间。
    (3)viewWillDisappearviewDidDisappear是与其对应的,在 View 销毁时触发的,下面就不举例说明了。

    -(void)viewWillAppear:(BOOL)animated
    {
        [super viewWillDisappear:YES];
        //do some thing
    }
    -(void)viewDidAppear:(BOOL)animated
    {
        //do some thing
        [super viewDidAppear:YES];
    }
    

    5.viewWillLayoutSubviews方法

    (1)该方法主要进行对视图控制器的 view 以及其子视图进行重新布局。
    (2) 在视图控制器的view 将要显示的时候触发。
    (3)也就是说,只有在该方法中设置 viewframe 才是可行的
    (4)viewDidLayoutSubviews在此方法触发之后触发。

    -(void)viewWillLayoutSubviews
    {
        [super viewWillLayoutSubviews];
        self.view.frame = CGRectMake(10, 10, 300, 548);
    }
    

    6.didReceiveMemoryWarning方法

    (1)当应用可用内存过低导致系统发出内存警告的时候,便会触发此方法。
    (2)清除不需要的视图,满足以下两个条件:1.视图已经被创建 2.不需要在 window 上显示了
    (3)当从写此方法时,需要调用父类。调用superdidReceiveMemoryWarning只是释放controllerresouse,不会释放view
    (4)具体过程:当系统内存不足时,首先UIViewController
    didReceiveMemoryWarining 方法会被调用,而didReceiveMemoryWarining 会判断当前ViewControllerview是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarining 会自动将viewcontrollerview以及其所有子view全部销毁,然后调用viewcontrollerviewdidunload方法。如果当前UIViewControllerview显示在window上,则不销毁该viewcontrollerview,当然,viewDidunload也不会被调用了。

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
        NSLog(@"@@@@@@@@@@内存警告@@@@@@@@@@");
    
        if ([self isViewLoaded] && !self.view.window) {
            self.view = nil;//将视图清除
        }
    }
    

    7.dealloc 方法

    (1)使用ARC的话,dealloc函数是不需要实现的,写了反而会出错。
    (2)有些特殊的情况,dealloc函数还是需要的。比如,在画面关闭的时候,需要把ViewController的某些资源释放,在viewDidDissppear不一定合适,viewDidUnload一般情况下只在memory warning的时候才被调用。
    MRC的情况下,我们自然会想到dealloc函数。

    -(void)dealloc
    {
        NSLog(@"dealloc");
    }
    

    loadView && viewDidLoad区别

    这两个方法是iphone开发中不可缺少的,他们都用来初始化视图(而且都是在视图加载的时候调用),但是他们也是又区别的。
    简单来说,就是当viewnib文件为nil时,手工创建视图界面时调用loadVIew;当viewnib文件存在的时候,初始化工作在viewDidLoad中实现。但是如果你的程序运行期间内存不足,视图控制器接到didReceiveMemoryWarning消息时,那么此时系统默认操作会检查当前视图控制器的view是否还在使用,假如此view不在当前正在使用的view hierarchy里面,且控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view

    相关文章

      网友评论

          本文标题:12.ViewController的生命周期及其方法介绍

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