iOS开发之loadView和viewDidLoad总结
http://www.1000phone.net/forum.php?mod=viewthread&tid=10507&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline
iPhone开发必不可少的要用到这两个方法。
他们都可以用来在视图载入的时候,初始化一些内容。 但是他们有什么区别呢?
viewDidLoad
此方法只有当view从nib文件初始化的时候才被调用。viewDidLoad用于初始化,加载时用到的。
loadView
此方法在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到。loadView是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
- (
void ) loadView {
UIView *view
= [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view
setBackgroundColor:_color] ;
self.view = view;
[ view release] ;
}
你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view
控制器会收到didReceiveMemoryWarning的消息。
默认的实现是检查当前控制器的view是否在使用。如果它的view不在当前正在使用的view
hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release,
loadView方法将被再次调用来创建一个新的view。
----------------------------------------------------------------------------------------------------------------------
viewDidLoad ,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。
---------------------------------------------------------------------------------------------------------------------------------------------
UIViewController 的内存管理
在 iOS3.0 后,UIViewController 多了一个叫做
viewDidUnLoad 的方法。
先看下 UIViewController 从创建 view
到展示的流程的几个函数
-init
-initWithNibName:bundle:
这两个方法都是初始化一个
vc,但请注意 view
不是这时候载入的
-loadView
-viewDidLoad
当一个视图准备展现时,vc 首先会判断
view 是否已经创建否则便通过之前指定的 xib 文件来初始化 view,以及绑定其他关系(若没有指定 xib 文件,则默认会搜索和 vc 同名的
xib,比如 myNameViewController 就会搜索 myNameViewController.xib 文件)
若是没有
xib 文件,你就可以在 loadview 中自己手动创建这个 viewControoler 需要的视图。接下来就是调用到
-viewDidLoad,许多人喜欢在这里做些其他事情,比如做个 http 请求、建立个数组啥的。这里若不处理正确,-viewDidUnload
激活时内存就容易泄露了,稍后提到。
-view()appear
-view()disappear
这几个方法就不解释了
-viewDidUnload
该方法在收到内存警告,同时该视图并不在当前界面显示时候会被调用,此时该
controller 的 view 已经被释放并赋值为 nil。
接下来你要做的是
把实例变量的子视图释放(IBOulet
的,以及自己添加的)
其他实例变量,比如之前在 -viewDidLoaded 中实例的数据数组、http 请求释放掉
因为当该
viewController 再次被激活准备显示时(比如 navigationControler 返回到上一级),vc 发现自己的 view
为空后会重复之前的流程直到把 view
给创建起来。若没将自己额外添加的子视图,各种类实例变量释放,这里便会重新再次创建。
于是,内存泄露了。
-------------------------------------------------------------------------------------------------------------------------------------------注意iphone开发中的这两个函数viewWillAppear和viewDidAppear
每当视图准备在屏幕上显示,或者视图已在屏幕上完全显示时,将调用这两个方法。
viewWillAppear:方法更新准备显示的视图的信息。调用时,视图可能还没有被加载。
使用viewDidAppear:来触发视图完全显示在屏幕上之后的行为,例如任何动画。
viewdidload是当程序第一次加载view时调用,以后都不会用到,而viewDidAppear是每当切换到view时就调用。
loadView和viewDidLoad方法。假设不使用xib文件对视图布局,那么loadView方法必须设置屏幕,并对任何子视图布局。每当继承一个具体的子类,例如UITableViewController或UITabBarController时,务必调用[super
loadView]或者实现viewDidLoad。这样一来,在进行定制之前,父类可以对屏幕进行适当的设置。当代码基于具体的子类时,苹果的文档和示例代码鼓励使用viewDidLoad。
viewDidLoad
此方法只有当view从nib文件初始化的时候才被调用。viewDidLoad用于初始化,加载时用到的。
loadView
此方法在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到。loadView是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。
viewDidLoad
,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。
------------------------------------------------------------------------------------------------------------------------
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法。 他们都可以用来在视图载入的时候初始化一些内容。
但是他们有什么区别呢?
viewDidLoad 方法只有当
view 从 nib 文件初始化的时候才被调用。viewDidLoad 用于初始化,加载时用到。
loadView 方法在控制器的 view 为 nil
的时候被调用。 此方法用于以编程的方式创建 view 的时候用到。loadView
是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
- ( void ) loadView {
UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen]
.applicationFrame] ;
[ view setBackgroundColor:_color] ;
self.view =
view;
[ view release] ;
}
你在控制器中实现了 loadView
方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到 didReceiveMemoryWarning
的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view hierarchy 里面,且你的控制器实现了
loadView 方法,那么这个 view 将被 release, loadView 方法将被再次调用来创建一个新的 view。
nil是空的意思。相当于NULL。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。
首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。
在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。
在Objective-C中,你来对象在功能上等价于其他很多语言中的NULL指针。区别是可以对nil调用方法,而不致导致程序崩溃或抛出异常。
---------------------------------------------------------------------------------------------------------------------
一、loadView
永远不要主动调用这个函数。view
controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数。如果你用IB创建view并初始化view
controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。
这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。
所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。
如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS
3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。
这个网上的资料都说的很不全面,尤其是蓝色字部分。
二、viewDidLoad
这个函数在controller加载了相关的views后被调用,而不论这些views存储在nib文件里还是在loadView函数中生成。而多数情况下是做nib文件的后续工作。
三、viewDidUnload
这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放它的view以及view相关的对象。由于controller通常保存这view以及相关object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据。
通常controller会保存nib文件建立的views的引用,但是也可能会保存着loadView函数创建的对象的引用。最完美的方法是使用合成器方法:self.myCertainView = nil
这样合成器会release这个view,如果你没有使用property,那么你得自己显示释放这个view。
网上对这个函数的描述含含糊糊,看了等于没看。
四、结论
所以流程应该是这样:
(loadView/nib文件)来加载view到内存
——>viewDidLoad函数进一步初始化这些view
——>内存不足时,调用viewDidUnload函数释放views
—->当需要使用view时有回到第一步
如此循环
----------------------------------------------------------------------------------------------------------------------
viewDidUnload方法
当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)
内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS
3.0及以后viewDidUnload方法是更好的方式
在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release
view时已经将其release掉了)
-----------------------------------------------------------------------------------------------------------------------注意iphone开发中的这两个函数viewWillAppear和viewDidAppear
每当视图准备在屏幕上显示,或者视图已在屏幕上完全显示时,将调用这两个方法。
viewWillAppear:方法更新准备显示的视图的信息。调用时,视图可能还没有被加载。
使用viewDidAppear:来触发视图完全显示在屏幕上之后的行为,例如任何动画。
loadView和viewDidLoad方法。假设不使用xib文件对视图布局,那么loadView方法必须设置屏幕,并对任何子视图布局。每当继承一个具体的子类,例如UITableViewController或UITabBarController时,务必调用[super
loadView]或者实现viewDidLoad。这样一来,在进行定制之前,父类可以对屏幕进行适当的设置。当代码基于具体的子类时,苹果的文档和示例代码鼓励使用viewDidLoad。
iPhone开发必不可少的要用到这两个方法(loadView VS viewDidLoad
)。 他们都可以用来在视图载入的时候,初始化一些内容。 但是他们有什么区别呢?
viewDidLoad
此方法只有当view从nib文件初始化的时候才被调用。viewDidLoad用于初始化,加载时用到的。
loadView 此方法在控制器的view为nil的时候被调用。
此方法用于以编程的方式创建view的时候用到。loadView是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。
viewDidLoad
,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。
---------------------------------------------------------------------------------------------------------------------
iPhone开发必不可少的要用到这两个方法。他们都可以用来在视图载入的时候,初始化一些内容。
但是他们有什么区别呢?
viewDidLoad
此方法只有当view从nib文件初始化的时候才被调用。
loadView
此方法在控制器的view为nil的时候被调用。此方法用于以编程的方式创建view的时候用到。
如:
-
(void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
[view
setBackgroundColor:_color];
self.view = view;
[view release];
}
你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view
控制器会收到didReceiveMemoryWarning的消息。 默认的实现是检查当前控制器的view是否在使用。
如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release,
loadView方法将被再次调用来创建一个新的view。
------------------------------------------------------------------------------------------------------------------------
loadView 和 viewDidLoad 是 iPhone
开发中肯定要用到的两个方法。
他们都可以用来在视图载入的时候初始化一些内容。 但是他们有什么区别呢?
viewDidLoad 方法只有当 view 从 nib
文件初始化的时候才被调用。viewDidLoad 用于初始化,加载时用到。
loadView 方法在控制器的 view 为nil 的时候被调用。此方法用于以编程的方式创建 view 的时候用到。loadView
是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
- ( void ) loadView {
UIView *view = [ [ UIView
alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view
setBackgroundColor:_color] ;
self.view = view;
[ view release]
;
}
你在控制器中实现了 loadView
方法,那么你可能会在应用运行的某个时候被内存管理控制调用。如果设备内存不足的时候,view 控制器会收到 didReceiveMemoryWarning
的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view hierarchy
里面,且你的控制器实现了 loadView 方法,那么这个 view 将被 release, loadView 方法将被再次调用来创建一个新的
view。
------------------------------------------------------------------------------------------------------------------------
viewDidUnload方法
当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)
内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS
3.0及以后viewDidUnload方法是更好的方式。
------------------------------------------------------------------------------------------------------------------------
由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起
init方法
在init方法中实例化必要的对象(遵从LazyLoad思想)
init方法中初始化ViewController本身
loadView方法
当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。
如果手工维护views,必须重载重写该方法
如果使用IB维护views,必须不能重载重写该方法
loadView和IB构建view
你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view
控制器会收到didReceiveMemoryWarning的消息。 默认的实现是检查当前控制器的view是否在使用。 如果它的view不在当前正在使用的view
hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release,
loadView方法将被再次调用来创建一个新的view。
viewDidLoad方法
viewDidLoad
此方法只有当view从nib文件初始化的时候才被调用。
重载重写该方法以进一步定制view
在iPhone OS
3.0及之后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引
viewDidLoad后调用数据Model
viewDidUnload方法
当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)
内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS
3.0及以后viewDidUnload方法是更好的方式
在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release
view时已经将其release掉了)
在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等
release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统release
view时已经将其release掉了)
一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行
viewDidUnload中被release的对象必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新创建的对象
dealloc方法
viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情。
文章二:
viewDidUnload
该方法在收到内存警告,同时该视图并不在当前界面显示时候会被调用,此时该 controller 的 view
已经被释放并赋值为 nil。
接下来你要做的是
把实例变量的子视图释放(IBOulet 的,以及自己添加的)
其他实例变量,比如之前在
-viewDidLoaded 中实例的数据数组、http 请求释放掉
因为当该 viewController 再次被激活准备显示时(比如
navigationControler 返回到上一级),vc 发现自己的 view 为空后会重复之前的流程直到把 view
给创建起来。若没将自己额外添加的子视图,各种类实例变量释放,这里便会重新再次创建
---------------------------------------------------------------------------------------------------------------------
loadView 和 viewDidLoad 的区别
分享
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法。
他们都可以用来在视图载入的时候初始化一些内容。 但是他们有什么区别呢?
viewDidLoad 方法只有当 view 从 nib
文件初始化的时候才被调用。viewDidLoad 用于初始化,加载时用到。
loadView 方法在控制器的 view 为 nil 的时候被调用。
此方法用于以编程的方式创建 view 的时候用到。loadView
是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
-
(void)loadView {
UIView * tmp=[[UIView alloc] initWithFrame:CGRectMake(0,
0, 320, 480)];
tmp.backgroundColor=[UIColor
orangeColor];
self.view=tmp;
[tmp release];
}
你在控制器中实现了
loadView 方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到
didReceiveMemoryWarning 的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view
hierarchy 里面,且你的控制器实现了 loadView 方法,那么这个 view 将被 release, loadView
方法将被再次调用来创建一个新的 view。
----------------------------------------------------------------------------------------------------------------------
-(void)viewWillAppearBOOL)animated,- (void)viewDidLoad
的区别。
viewwillappear是每次视图控制器的视图出现前执行的代码。而viewdidload是每次视图控制器载入是执行的代码。
比如说:当a视图控制器的视图第一次出现是两个都要执行,但当a被push后有pop回来时,只有viewwillappear执行。
loadView 和 viewDidLoad 的区别
分享
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法。
他们都可以用来在视图载入的时候初始化一些内容。 但是他们有什么区别呢?
viewDidLoad 方法只有当 view 从 nib
文件初始化的时候才被调用。viewDidLoad 用于初始化,加载时用到。
loadView 方法在控制器的 view 为 nil 的时候被调用。
此方法用于以编程的方式创建 view 的时候用到。loadView
是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
-
(void)loadView {
UIView * tmp=[[UIView alloc] initWithFrame:CGRectMake(0,
0, 320, 480)];
tmp.backgroundColor=[UIColor
orangeColor];
self.view=tmp;
[tmp release];
}
你在控制器中实现了
loadView 方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到
didReceiveMemoryWarning 的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view
hierarchy 里面,且你的控制器实现了 loadView 方法,那么这个 view 将被 release, loadView
方法将被再次调用来创建一个新的 view。
iOS开发之loadView和viewDidLoad总结的更多相关文章
- iOS开发之loadView、viewDidLoad及viewDidUnload的关系
iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系 标题中所说的3个方 ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- iOS开发之UIImage等比缩放
iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...
- iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用
iOS开发之 Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...
- iOS开发之info.pist文件和.pch文件
iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...
- iOS开发之WKWebView简单使用
iOS开发之WKWebView简单使用 iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
随机推荐
- ecshop 调用收货地址
html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...
- CLR
[精]步步为营 C# 技术漫谈 三.公共语言运行库(CLR) http://www.cnblogs.com/springyangwc/archive/2011/06/12/2079250.html [ ...
- .net3.5后新增的 BeginInvoke EndInvoke 异步操作
protected void Main() { //首先定义一个方法的封装..后边的LongTimeMethod是被封装的方法.. Func<int> longTimeAction = n ...
- Mount挂载命令使用方法
语法: mount -t 类型 -o 挂接方式 源路径 目标路径 -t 详细选项: 光盘或光盘镜像:iso9660 DOS fat16文件系统:msdos Windows 9x fat32文件 ...
- Apache CXF实现WebService入门教程(附完整源码)
Apache CXF实现WebService非常简单实用,只需要几步就可以实现一个简单的web service. 首先我们需要新建一个maven项目,在pom中添加依赖和jetty作为测试的web s ...
- [Asp.Net]获取客户端ip和mac地址
摘要 有时候,我们需要获取客户端的一些信息,以便进行统计.比如:客户端的唯一标识,ip等信息 IP 通过获取HTTP_X_FORWARDED_FOR,或者REMOTE_ADDR可以获取客户端的ip. ...
- addEventListener和on的区别
为什么需要addEventListener? 先来看一个片段: html代码 <div id="box">追梦子</div> 用on的代码 1 window ...
- linux网络:常用命令(一)
1.ifconfig 可以查看Linux的网卡情况 ifconfig eth0 查看 eth0的信息 给一块网卡设置多个ip地址: ifconfig eth0:0 192.168.1.12 255. ...
- hdu4951 Multiplication table (乘法表的奥秘)
http://acm.hdu.edu.cn/showproblem.php?pid=4951 2014多校 第八题 1008 2014 Multi-University Training Contes ...
- CSS 使用推荐
中文字体css编码转换 微软雅黑 \5FAE\8F6F\96C5\9ED1 或 Microsoft YaHei 黑体 \9ED1\4F53 新宋体 \65b0\5b8b\4f53 宋体 \5b8b ...