长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系

一、loadView

  1. 什么时候被调用?

    • 每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。
  2. 有什么作用?

    • loadView方法是用来负责创建UIViewController的view
  3. 默认实现是怎样的?

    1. 它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view

      • 如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
        [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];  
      • 如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件
        [[MJViewController alloc] init]; // 加载MJViewController.xib
    2. 如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下

      self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

       

  4. 怎样正确使用这个方法?

    1. 大家都知道UIViewController的view可以通过xib文件来创建,但是在某些情况下,xib不是那么地灵活,所以有时候我们想通过代码来创建UIView,比如:
      self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

       

    2. 如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],因为在第3点里面已经提到:若没有xib文件,[super loadView]默认会创建一个空白的UIView。我们既然要通过代码来自定义UIView,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。正确的做法应该是这样:
      - (void)loadView {  self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];  
      }

       

    3. 不需要调用[super loadView],你调用了也不会出错,只是造成了一些不必要的开销。
    4. 总结一句话,苹果设计这个方法就是给我们自定义UIViewController的view用的

二、viewDidLoad

  1. 什么时候被调用?

    • 不过你是通过xib文件还是重写loadView创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法
  2. 有什么作用?

    • 一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。

三、viewDidUnload

  1. 什么时候被调用? 

    • ios设备的内存是极其有限的,如果应用程序占用的内存过多的话,系统就会对应用程序发出内存警告。UIViewController就会收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默认实现是:如果当前UIViewController的view不在应用程序的视图层次结构(View Hierarchy)中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法
  2. 有什么作用?

    • 上面说到,发出内存警告且view被释放的时候就会调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil
      - (void)viewDidUnload {  [super viewDidUnload];  self.name = nil;  self.pwd = nil;  
      }
  3. dealloc也是用来释放资源的,那跟viewDidUnload有什么关系?

    • 当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用

 四、三个方法的关系

  • 第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view

  • view创建完毕后会调用viewDidLoad方法进行界面元素的初始化

  • 当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法

  • 当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view

  • view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化

 

转载于:https://www.cnblogs.com/zhuyiios/p/6674659.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2359):如何注册事件

<template><view><view>{{msg}}</view><view>{{你好世界}}</view><image v-bind:src"imgUrl" mode""></image><view v-for"(item,index) in arr">序号:{{index}}名字:{{item.name}},年龄…

hbase-client1.2.0新版api获取数据方式

public static void QueryAll(String tableName) {try {Table table connection.getTable(TableName.valueOf(tableName));ResultScanner rs table.getScanner(new Scan());for (Result r : rs) {System.out.println("获得到rowkey:" new String(r.getRow()));for…

微信无法连接服务器1-502,只有一部iphone x手机,在微信公众号中选择菜单,出现bad gateway 502错误,原因?...

1.菜单项对应的网页链接参见下图&#xff1a;2.后台看到下面的错误信息:--- iphone x 访问日志172.17.0.28 - - [03/Jan/2020:10:19:17 0800] "GET /m02?atwxyes HTTP/1.0" 502 182 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) Ap…

前端学习(2360):生命周期函数的学习

app.vue <script>export default {onLaunch: function() {console.log(App Launch)},onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onError:function(err){console.log(出现异常,err)}} </script><style>/*每个…

Java 中文转拼音

废话不多说直接上源码 依赖jar包: <dependency><groupId>com.github.obiteaaron</groupId><artifactId>pinyin4j-multi</artifactId><version>1.0.0</version></dependency> package com.jctl.cloud.utils; import net.sourc…

three.js script vertex和fragment在react中使用/纯js写法

html原生script写法 <script id"vs" type"x-shader/x-vertex"> …… </script> <script id"fs" type"x-shader/x-fragment"> …… </script> 调用方式如下&#xff1a; material new THREE.ShaderMaterial(…

糖豆人服务器要维护多久,糖豆人刚上四天,紧急维护9小时后又延长,玩家:从中午到现在了...

最近&#xff0c;不少主播都纷纷开始玩起一款多人闯关类的游戏《糖豆人: 终极淘汰赛》&#xff0c;说起这游戏很多人仍然把它定位成多人吃鸡类型&#xff0c;其实它的原型来自于电视上每年夏天都要放的冲关挑战节目&#xff0c;小编还记得当时有一个特别出名的节目叫“男生女生…

前端学习(2361):下拉刷新的学习

content.vue <template><view><view>这是列表页</view><view v-for"item in list">{{item}}</view></view> </template><script>export default {data() {return {list:[前端,java,UI,测试]}},onPullDownRef…

Delphi XE10编写的《开放式公路收费系统》

Delphi XE10编写的《开放式公路收费系统》 ———————————————————————————————————————— 适用于一级公路、机场公路、开放式收费公路 开发工具&#xff1a;Delphi XE10 数据库&#xff1a;SQL Server 2008 硬件&#xff1a; 一体工控机 …

Three.js 新旧版本区别

Projector 新版THREE.Projector挪出去了 需要引入examples/js/renderers/Projector.js的js&#xff08;可以从github上找&#xff09; scene.addObject 新版Three.js会报错方法找不到 scene.addObject已经替换为scene.add() Detector Three.js 源码更新&#xff0c;删除了…

启动服务器如何删除文件,在服务器启动时用Filter来删除某种类型的文件

简介这篇文章主要介绍了在服务器启动时用Filter来删除某种类型的文件以及相关的经验技巧&#xff0c;文章约1303字&#xff0c;浏览量409&#xff0c;点赞数3&#xff0c;值得参考&#xff01;代码:import java.io.File;import java.io.FileFilter;import javax.servlet.Servle…

前端学习(2362):上拉加载

content.vue <template><view><view>这是列表页</view><view v-for"item in list">{{item}}</view><button click"pullDown">下拉刷新</button></view> </template><script>export de…

Scala 开发 Spark 程序

看spark和scala版本 运行spark-shell Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ / __/ _/ /___/ .__/\_,_/_/ /_/\_\ version 1.6.0 /_/ Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181) 得到spark版本1.6.0&#xff…

Scala 写第一个程序HelloWorld

idea安装scala插件 Settings——Plugins——搜索Scala&#xff0c;进行安装 下载scala-2.12.8.zip并解压 https://www.scala-lang.org/download/ 所有版本列表 https://www.scala-lang.org/download/all.html 新建sbt项目&#xff08;类似maven&#xff09; 选择Scale——…

Spark 连接 HBase 入库及查询操作

本实例采用Scala开发&#xff0c;实现了RDD数据两种方式入库到HBase&#xff0c;从HBase中读取数据并print输出。 build.sbt name : "SparkSbt"version : "0.1"scalaVersion : "2.10.5"libraryDependencies "org.apache.spark" %% &…

C++程序设计语言(特别版) -- 一个桌面计算器

前言 这里要介绍各种语句和表达式&#xff0c;将通过一个桌面计算器的程序做些事情&#xff0c;该计算器提供四种座位浮点数的中缀运算符的标准算术运算。这个计算器由四个部分组成&#xff1a;一个分析器&#xff0c;一个输入函数&#xff0c;一个符号表和一个驱动程序。分析器…

前端学习(2364):图片的上传

message.vue <template><view><button type"primary" click"chooseImg">上传图片</button><image v-for"item in imgArr" :src"item" mode""></image></view> </template>…

superset docker方式安装

superset是优秀的数据可视化开源项目&#xff0c;为用户提供了丰富的图表视觉效果&#xff0c;基于python开发。但仅可以以图表、表格形式展示结果&#xff0c;不支持页面组装等高级BI功能。 准备环境docker 然后执行命令 docker pull amancevice/superset docker run --det…