zoukankan      html  css  js  c++  java
  • UIViewController中的loadView方法

    一、死循环(self.view为nil

    @implementation ViewController
    
    - (void)loadView{
        NSLog(@"loadView.......");
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSLog(@"viewdidLoad.....");
        UIView *selfView = self.view;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    @end

    运行结果是:

    2016-02-29 11:54:42.778 Test6[849:84362] loadView.......

    2016-02-29 11:54:42.925 Test6[849:84362] viewdidLoad.....

    ...........循环出现

    原因分析:因为UIViewController没有对应的nib文件,因此会进入loadView方法,然而loadView没有实例化self.view,进入viewDidLoad后用到self.view对象,由于self.view为nil,导致调用loadView方法。所以一直在loadView和viewDidLoad两个方法中循环执行。

    二、系统UIViewController类提供的loadView功能

    当存在nib时,执行nib;

    当不存在nib时,创建一个frame为(0,0,width,height)的视图。

    三、UIViewController实例化self.view的方式

    1、创建nib文件,在nib中设置view;

    2、没有nib文件时,不重写loadView方法,默认使用父类的loadView创建一个frame为(0,0,width,height)的视图。

    3、没有nib文件时,重写loadView方法,将自定的UIView赋值“=”给self.view

    上面三种方式,缺一不可!!!

    四、iOS9前后

    在iOS9之前,系统为UIViewController自动创建的view的frame为(0,20,width,height),是因为用的是[UIScreen applicationFrame]方法。

    但是iOS9之后,[UIScreen applicationFrame]方法被弃用,使用的是[UIScreen bounds]方法。因此frame为(0,0,width,height)。

  • 相关阅读:
    Android Studio使用百度地图(二)
    Android Studio使用百度地图(一)
    寒假每日日报30(体温登记app——进度3)
    EF CodeFirst数据注解特性详解
    EF CodeFirst配置领域类
    EF CodeFirst简介、默认约定、数据库初始化策略
    EF CodeFirst关于Mysql如何自动生成数据库表
    EF的预先加载--Eager Loading
    EF的延迟加载LazyLoad
    ADO.NET中sqlserver和mysql的变量名
  • 原文地址:https://www.cnblogs.com/zhouyi-ios/p/5227069.html
Copyright © 2011-2022 走看看