每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的.
一、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函数创建的对象的引用。最完美的方法是使用合成器方法:
1
self.myCertainView = nil;
这样合成器会release这个view,如果你没有使用property,那么你得自己显示释放这个view。
网上对这个函数的描述含含糊糊,看了等于没看。
四、结论
所以流程应该是这样:
(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views
—->当需要使用view时有回到第一步
如此循环
需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Builder)中有时候就会迷糊.其实也很好区分,孤零零地创建了一个nib文件,没有和其他可被实例化的类有直接或间接关系的时候,这个类或这些类(一个nib文件俺也可能包含多个类)是没有机会被实例化的,所以这种情况只是通过ib创建了一个类,而没有实例化.真正的实例化还需要通过在Xcode用代码来读取这个nib文件.知道这两这的区别后这些方法也就容易辨认多了
viewDidLoad其实没什么可混淆的,无论通过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后肯定会执行这个方法.
loadView需要分两种情况.当你通过Xcode实例化一个类的时候就需要自己在controller中实现这个方法.而在IB中实例化就不需要实现它.
initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的.
awakeFromNib这个方法是一个类在IB中被实例化时被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.
initWithCoder是一个类在IB中创建但在xocdde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.
awakeFromNib
当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib
viewDidLoad
当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad
- 浏览: 3475408 次
- 性别:
- 来自: China
-
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
评论
1 楼
啸笑天
2014-04-01
当程序对Nib文件进行反序列化然后初始化时,会调用一次awakeFromNib。
但是如果你使用initWithNibName调入Nib时,awakeFromNib是不会被调用的。
但是如果你使用initWithNibName调入Nib时,awakeFromNib是不会被调用的。
发表评论
-
iOS11-sdk11-xcode9-iphone8/8+/x适配
2017-11-22 16:54 4666原文地址:https://github.com/easyu ... -
iPhoneX指示条(visual indicator)
2017-10-20 17:54 2999原文地址:https://github.com/e ... -
swift项目在iOS8 通过init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle
2017-06-21 19:50 1782原文地址 初始化代码: MatchViewCo ... -
iOS10.3中划线失效
2017-05-12 10:38 1171原文地址 NSString *price ... -
iOS的标识符
2017-05-12 10:38 1240UDID的全名为 Unique Device Ide ... -
管理你的第二屏(airPlay)
2017-02-14 00:47 1732需求: 1、投射airplay后,有些页面或 ... -
strong修饰符实现weak效果(对象释放时,属性置nil)
2017-01-06 18:12 1287// // NSObject+EZ_Deal ... -
AVPlayer 截屏(swift3.0)
2017-01-06 09:50 2843开始做的是一般的vod视频截屏,用AVA ... -
CATransform3D
2016-11-06 22:03 2042CATransform3D 的数据结构定义了一个同质的三维 ... -
CMTime
2016-11-02 17:59 3754CMTime是专门用于标识电影时间的结构体,通常用如下 ... -
多媒体的一些基础概念
2016-10-27 17:03 1324音频采样 大自然中的声音,他的形态是一种波。我们通过采样 ... -
iOS10/sdk10/xcode8/iphone7(+)/swift3适配
2016-09-18 11:51 2394Xcode 8 iOS Simulator正常启动 ... -
runloop小结
2016-06-01 00:46 0Thanks: 深入理解RunLoop 走进R ... -
iOS的framework动态库
2016-03-26 01:14 6905iOS的静态库有两种,.a和.framewor ... -
WebView图片自适应屏幕
2016-03-16 01:09 1191- (void)webViewDidFinishLoa ... -
UIModalPresentationFormSheet模式下隐藏键盘
2016-03-05 10:13 1317在通常情况下,我们使用UITextField空 ... -
图片抗锯齿处理方法
2016-03-03 14:06 5159一、 这个简单的键-值对添加到您的Info.plist:U ... -
NSURLSession
2015-12-22 08:56 3638NSURLSession 简介 NSURLConn ... -
HTTP简介
2015-12-21 20:01 1313一、TCP/IP 协议介绍 在介绍 HTTP 协议之 ... -
CFStringTransform
2015-12-21 15:17 996关于一种语言好不好用,你只需要衡量以下两种指标: API ...
相关推荐
loadView和viewDidLoad、viewDidUnLoad区别
每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的. 昨天看了下苹果官方的相关文档...
loadView,viewDidLoad,viewDidUnload,这三个函数到底应该怎么用? 搜索一下,全是转载,大概内容是这样: loadView 手动加载view viewDidLoad用于nib文件加载后,进一步处理 viewDidUnload是viewDidLoad的镜像 ...
本文将重点介绍`viewDidLoad`与`viewWillAppear`两个关键方法的调用时机及作用,并通过图表形式总结常见的生命周期方法调用顺序,以便于开发者更好地理解和应用。 #### 视图控制器的生命周期 视图控制器是iOS应用...
_loadview = [[MBLoadingIndicator alloc ] init ]; // Start the loader [ self .loadview start ]; // Add the loader to our view [ self .view addSubview: self .loadview]; 用法 ###更改百分比 // ...
需要注意的是,`loadView`和`viewDidLoad`只会在视图首次加载时执行一次。如果在`view`为nil时再次访问`view`属性,系统不会再次调用`loadView`,而是直接返回已创建的视图。 在实际开发中,你可能会遇到这样的情况...
创建项目后,我们会看到一个默认的`ViewController.m`文件,其中包含一个简单的`loadView`方法,该方法已经在代码中初始化了一个UILabel来显示"Hello, World!"。我们可以修改这个方法,以不依赖XIB文件: ```...
如果`UIViewController`没有设置视图(即`self.view`为`nil`),那么系统会自动调用`loadView`方法。 2. **`viewDidLoad`**:在视图加载完成后会被调用。这是进行额外配置的好时机,比如设置约束、添加子视图等。 ...
5. 视图控制器的生命周期:与应用类似,UIViewController也有其特定的生命周期,如loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear和viewDidDisappear等方法,这些方法在不同的显示和隐藏...
SwiftUI是苹果在2019年推出的一种全新的界面构建框架,它为iOS、macOS、watchOS和tvOS提供了声明式编程的方式来设计用户界面。然而,在实际开发中,我们可能会遇到需要与传统UIKit组件交互的情况,比如利用UIKit的...
2. **UIViewController的生命周期**:理解一个UIViewController从加载到销毁的过程,包括init、loadView、viewDidLoad、viewWillAppear、viewDidAppear等方法的作用。 3. **Auto Layout**:自动布局系统使得开发者...
24. **控制器视图的生命周期**:包括awakeFromNib、loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear等,用于处理视图的加载、显示和消失。 25. **标签页控制器...
- UIViewController生命周期,包括init、loadView、viewDidLoad等方法。 - UIView的绘制与动画,如CADisplayLink、Core Animation。 - UI控件的自定义和手势识别,如UIButton、UILabel、UITableView、...
如果控制器是通过代码直接创建的,例如`[[YFViewController alloc]init]`,生命周期顺序将是`-initWithNibName:bundle:` -> `-init` -> `-loadView` -> `-viewDidLoad` -> `-viewDidAppear:`。如果控制器是从XIB或...
1. UIViewController的生命周期:包括`awakeFromNib`、`init`、`loadView`、`viewDidLoad`、`viewWillAppear`、`viewDidAppear`、`viewWillDisappear`和`viewDidDisappear`等方法的使用场景和调用顺序。 2. 自定义...
2. `init` 和 `initWithCoder:`:分别用于代码创建和从 nib 文件或故事板加载实例时的初始化。前者适用于手动创建对象,后者适用于从序列化数据恢复。 3. `loadView`:此方法默认由系统调用,用于加载视图。若...
1. UIViewController调用顺序:`initWithNibName:bundle:` -> `loadView` -> `viewDidLoad` -> 使用视图 -> `viewDidUnload` -> `dealloc`。`initWithNibName:bundle:`初始化,`loadView`加载视图,`viewDidLoad`...
- `initWithNibName:bundle:`:当从故事板或 nib 文件加载View Controller时,此方法被调用,传入 nib 文件名和资源包。 - `awakeFromNib`:当 nib 文件加载完成后,此方法会被调用,此时View Controller的所有...