loadView的使用总结

一、loadView 

1. loadView什么时候被调用?

          每次访问UIViewController的view(如 controller.view、self.view)并且view为nil,loadView方法就会被调用

2. 有什么作用

   loadView 方法是用来负责创建UIViewController的view

3. 默认实现是怎样的?

    默认实现即[super loadView]里面做了好多事情:

               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];  
// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}} 
[super loadView]里面就大致完成1>和2>中叙述的内容

4.如何正确使用这个方法?

    UIViewController 可以通过xib文件来创建,但在某些情况下,xib不是那么灵活,所有我们有些时候想通过代码来创建UIView     

比如: self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

                      如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],第三点已经提到若没有xib文件,

                      [super loadView]默认创建一个空白的UIView。我们既然要通过代码来自定义UIVIew,那么就没必要事先创建一个空白的UIView,以节省不必要的开销,正确的做法应该是这样的:

                           - (void)loadView {

self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
}
不需要调用[super loadView],即使调用了也不会出错,只是造成了一些不必要的开销。总而言之,苹果设计这个方法是给我们自定义UIViewController的view用的

二、viewDidLoad

1. 什么时候被调用?

  无论是通过xib文件还是重写loadView 方法创建的UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法的。

 2. 有什么作用?

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

             例如:

           - (void)viewDidLoad {

[super viewDidLoad];
//添加一个按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
[button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}

三、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被释放的时候调用

四、三个方法的关系

    1.    第一次访问UIViewController的view时,view为nil,然后  机会调用loadview方法来创建view

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

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

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

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

 

转载于:https://www.cnblogs.com/gwzf/p/7157834.html

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

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

相关文章

数据库备份 java jar_Java实现数据库备份并利用ant导入SQL脚本

​数据备份对于经常在运维部署方面的工作者来说,是一件相对简单的事情,都可以通过某一个SQL工具进行备份,但是如果在项目运行当中,我们需要对数据进行实时,或者是每隔一星期,一个月,等等进行数据…

JSF简单Ajax示例

今天,我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章,请单击以下链接: 重定向后的JSF持久化对象和消息 , 使用JAAS和JSF进行用户登录验证 , JSF:Converter and Bean Au…

常用的好用的window工具

1. FastStone Capture截图录屏软件 百度软件中心:http://rj.baidu.com/soft/detail/13504.html?ald 注册企业版: 用户名:c1ikm 注册码:AXMQX-RMMMJ-DBHHF-WIHTV 中文输入乱码解决方法: 2. Notepad文本编辑器&#xff…

表分区

http://www.cnblogs.com/leestar54/p/6225821.html转载于:https://www.cnblogs.com/jouny/p/6262850.html

java飞鸽传书_feige 飞鸽传书源代码java 实现不错的联系网络编程的资料飞鸽传书的GUI(java实现) - 下载 - 搜珍网...

我的飞鸽传书/FileFilter.java我的飞鸽传书/FileNameExtensionFilter.java我的飞鸽传书/飞鸽传书/classes/feige/About.class我的飞鸽传书/飞鸽传书/classes/feige/ConnectOthers$ReadMessageThread.class我的飞鸽传书/飞鸽传书/classes/feige/ConnectOthers.class我的飞鸽传书…

JAXB和根元素

XmlRootElement是人们习惯于与JAXB(JSR-222)一起使用的注释。 目的是将根元素与类唯一关联。 由于JAXB类映射到复杂类型,因此一个类有可能对应于多个根元素。 在这种情况下,无法使用XmlRootElement ,人们开始感到有些困…

python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例

Python基于socket模块实现UDP通信功能示例本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考,具体如下:一 代码1、接收端import socket#使用IPV4协议,使用UDP协议传输数据ssocket.socket(socket.AF_INET, socket.SOC…

Hibernate缓存基础知识

最近,我尝试了休眠缓存。 在这篇文章中,我想分享我的经验,并指出Hibernate Second Level Cache的一些细节。 在此过程中,我将指导您阅读一些有助于实现缓存的文章。 让我们从地面开始。 在休眠状态下缓存 缓存功能旨在减少必要的…

TP3.2之WHERE组合条件处理

1、条件都是int类型: $User->where(type1 AND status1)->select(); 2、条件包含字符串类型: 使用3.1以上版本的话,使用字符串条件的时候,建议配合预处理机制,确保更加安全, $Model->where("i…

linux-ssh远程后台执行脚本-放置后台执行问题(转)

写了一个监控负载的小脚本(死循环,测试结束后再kill对应进程),因需要监控多台服务器,所以在一台服务器上使用ssh统一执行脚本遇到问题:使用ssh root172.16.146.20 /usr/local/luly/loadavg.sh 2 2 &执行…

python2.7输入函数_Python2.7的用户输入函数有问题,无法让这些输入与程序一起工作...

我对python世界还是个新手,虽然我已经用php做了很多工作。。。这是我的案子。。。在我正在用python2.7为我的小程序编写一些代码。在在那个程序中,我需要2个用户输入,它们都是数字。在第一个数字不得大于11,也不得小于0。在第二个…

创建Java动态代理

Java动态代理机制提供了一种有趣的方式来创建代理实例。 不过&#xff0c;创建动态代理的步骤有些繁琐&#xff0c;请考虑将代理用于审核服务实例的方法调用所花费的时间– public interface InventoryService {public Inventory create(Inventory inventory);public List<I…

html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?...

新特性&#xff1a; 1. 拖拽释放(Drag and drop) API 2. 语义化更好的内容标签&#xff08;header,nav,footer,aside,article,section&#xff09; 3. 音频、视频API(audio,video) 4. 画布(Canvas) API 5. 地理(Geolocation) API 6. 本地离线存储 localStorage 长期存储数据&am…

Substring with Concatenation of All Words 题解

题意 You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters. For example, give…

java udp丢包_linux 系统 UDP 丢包问题分析思路

最近工作中遇到某个服务器应用程序 UDP 丢包&#xff0c;在排查过程中查阅了很多资料&#xff0c;总结出来这篇文章&#xff0c;供更多人参考。在开始之前&#xff0c;我们先用一张图解释 linux 系统接收网络报文的过程。● 首先网络报文通过物理网线发送到网卡● 网络驱动程…

【SQL】分组数据,过滤分组-group by , having

学习笔记&#xff0c;原文来自http://blog.csdn.net/robinjwong/article/details/24845125 创建分组 - GROUP BY 分组是在SELECT语句的GROUP BY子句中建立的。它的作用是通过一定的规则将一个数据集划分成若干个小的区域&#xff0c;然后针对若干个小区域进行数据处理。SELECT子…

使用EasyMock或Mockito

我大部分时间都在使用EasyMock &#xff0c;但是最近我和一些非常愿意使用Mockito的人一起工作。 我不打算在同一项目中使用两个框架来实现相同的目的&#xff0c;因此我采用了Mockito 。 因此&#xff0c;在过去的几个月中&#xff0c;我一直在使用Mockito &#xff0c;这是我…

CentOS下iptables 配置详解

如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [roottp ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy…

java lambda 多个参数_Java Lambda行为参数化

Java Lambda行为参数化我们可以将lambda表达式作为参数传递给方法。例子以下代码创建了一个名为Calculator的函数接口。在Calculator中有一个称为calculate的方法&#xff0c;它接受两个int参数并返回一个int值。在Main类中有一个引擎方法&#xff0c;它接受函数接口Calculator…