• ios


    • 从打印结果可以看出,先调用loadView再调用viewDidload
    • 代码:
    
    //
    //  ViewController.m
    //  test
    //
    //  Created by 裴波波 on 16/4/12.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    -(void)loadView{
    
        NSLog(@"loadView");
    }
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        NSLog(@"viewDidLoad");
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    @end
    
    

    打印结果

    • 看打印可以了解到先调用了loadview,再调用了viewDidload方法.

    • 为什么分别调用了两次?

      • loadView和viewDidLoad的区别就是,调用loadView时view还没有生成,调用viewDidLoad时,view已经生成了.
      • 当调用loadview时,view为空, -> 调用viewdidload控制器仍然没有自己的view,此时再次调用loadview方法让控制器生成一个黑色的view.
      • 注意点: 此时如果调用了loadview当时没有给viewController指定一个view的话,不能在viewdidload方法中用self.view = 某个view,此时如果调用view的set或者get方法都会使程序进入无限死循环中.看代码
    • viewDidload中

    - (void)viewDidLoad {
    
        [super viewDidLoad];
        NSLog(@"%p",self.view);
        NSLog(@"viewDidLoad");
    }
    
    
    • 打印结果

    • 程序陷入无限循环

    • 原因: 调用了self.view就相当于调用了loadview,由于重写loadview的方法时并没有给控制器的view指定一个view,所以会一直死循环下去...

    • 解决办法之一就是在loadview方法中给self.view指定一个view

    
    -(void)loadView{
    
        UIView * view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        view.backgroundColor = [UIColor blueColor];
        self.view = view;
        NSLog(@"loadView");
    }
    
    
    • 此时打印结果

    • 并且模拟器颜色为蓝色bluecolor

    小结:调用loadview方法,要给控制器指定view.否则在viewdidload方法中调用self.view(view的set或者get方法)都会使程序进入死循环.

    • 如果在loadview与viewdidload中都给控制器指定了view,那么从调用方法的顺序上看可以得到结果:最后被调用的viewdidload方法中的view会覆盖掉loadview中给控制器设置的view.

    • 为了加深理解看官方文档

    • 文档上说:当控制器的view为nil时,会调用这个方法,这个方法会创建一个view给控制器.

    • 如果控制器从xib加载控制的view,则你可以调用此方法来加载xib--> initWithNibName:bundle: 或者不调用此方法,控制器会根据有没有一个xib名字跟控制器类名一样的,如果一样就加载这个跟控制器名字一样的xib文件作为控制的view.如果没有xib来初始化控制器的view的话,则这个方法loadview会创建一个空白的view给控制器.

    • 如果用storyboard初始化控制器,就不用调用loadview方法了.

    • 如果重写这个方法给控制器创建view则这个view必须是一个单例,而且不能被其他的控制器使用.并且不可以调用super
    • 如果想初始化自定义的view,则在viewdidload中初始化即可.

    综上:不建议使用loadview,可以根据自己的需要在storyboard或者viewdidload中创建自己需要的view给控制器.

    视图控制器的生命周期

  • 相关阅读:
    深入了解C语言
    $_SERVER变量结构
    整理了一份招PHP高级工程师的面试题
    深入探究VC —— 编译器cl.exe(2)【转】http://blog.csdn.net/wangningyu/article/details/4837419
    vs2010 工程设置,调试中的目录问题【转】http://www.cnblogs.com/mlj318/archive/2011/10/09/2203510.html
    深入探究VC —— 链接器link.exe(4)【转】http://blog.csdn.net/wangningyu/article/details/4849452
    移植ffmpeg到VC环境心得 【转】
    深入了解VC++编译器【转】
    VC2010中"Include Directories" 和 "Additional Include Directories"的区别
    深入探究VC —— 资源编译器rc.exe(3)【转】http://blog.csdn.net/wangningyu/article/details/4844687
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5383703.html
Copyright © 2020-2023  润新知