zoukankan      html  css  js  c++  java
  • 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给控制器.

    视图控制器的生命周期

  • 相关阅读:
    jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
    jQuery 源码解析(二十三) DOM操作模块 替换元素 详解
    jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
    jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
    jQuery 源码分析(二十) DOM操作模块 插入元素 详解
    jQuery 源码分析(十九) DOM遍历模块详解
    python 简单工厂模式
    python 爬虫-协程 采集博客园
    vue 自定义image组件
    微信小程序 image组件坑
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5383703.html
Copyright © 2011-2022 走看看