viewDidLoad被提前调用
来源:互联网 发布:python rectangle 编辑:程序博客网 时间:2024/06/10 01:11
今天写项目的时候发现了一个非常奇怪的问题,我一度认为可能是我的 Xcode 出了 bug。
先来猜猜下面代码的执行顺序?
这是一段非常常见的代码,很多 controller 都是这么写的。
正常来说执行顺序肯定是 1、2、3、4 无疑。然而事实上,执行顺序却是:1、3、4、2。
这就导致了一个问题:viewModel 请求不到数据,因为走到第 4 步的时候,viewModel 还没有被初始化,此时它是 nil。
如下图所示:
从控制台中我们可以看到,最下面的 _viewModel = nil。而且当走完第 4 步后,程序竟然又回到了第 2 步。
起初我以为这是一个 Xcode 本身的 bug,因为它实在是太奇怪了。后来我才知道,原来是因为 viewDidLoad 被提前调用了。
viewDidLoad 方法一般只会在 nib 文件已载入内存,也就是视图树构建完成之后调用。
但是如果 controller 的 view 属性被使用时为 nil,就会导致 nib 的加载,从而导致 viewDidLoad 的调用。
对于本文来说,我们在初始化方法中写了 self.view.backgroundColor = xxx; 这句话本身并没有任何错误,但是它导致了 viewDidLoad 的提前调用,因此就出现了文章开头提到的情况,执行顺序变成了 1、3、4、2。
最后我的解决办法是,把成员变量 _viewModel 的初始化放到 viewDidLoad 里。这又是为什么呢?具体内容可以参考这篇文章:iOS 开发中的争议(一)类的成员变量应该如何定义?
大部分的类成员变量都需要在类初使化方法中赋值,大部分的 UIViewController 的成员变量,都需要在 viewDidLoad
方法中赋值。
- viewDidLoad被提前调用
- onActivityResult被提前调用
- Android onActivityResult被提前调用
- Android onActivityResult被提前调用
- 关于 UIViewController 的 viewDidLoad 被调用时机
- loadView,viewDidLoad,viewDidUnload什么时候被调用
- 浅论ViewController的加载 -- 解决 viewDidLoad 被提前加载的问题(pushViewController 前执行)
- viewDidLoad什么时候调用
- viewDidLoad调用animateWithDuration无效
- viewdidload的调用时机
- viewDidLoad 和 loadView 的区别,并且viewDidLoad可能被调用两次(或者多次)
- loadView, viewDidLoad, viewDidUnLoad,分别是在什么时候被调用的.
- 为何需要调用“super viewDidLoad”
- loadView和viewDidLoad调用顺序
- 为何需要调用“super viewDidLoad”
- viewdidload
- ViewDidLoad
- viewDidLoad
- 浅析MySQL中exists,in ,=的使用
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- Android studio关于含有转义字符的字符串无法Log,以及如何去掉转义字符问题
- 数据结构
- android开发利用AsyncHttpClient下载服务器文件
- viewDidLoad被提前调用
- VS2010控制台程序运行一闪而过的完美解决办法[转]
- UITableview
- 利用OpenSSL库对Socket传输进行安全加密(RSA+AES)
- android打开文件
- Java解析xml——SAX解析
- 缓存设计的一些思考
- (网络摘抄)UIImage指定大小裁剪图片
- 微信对账单接口的使用以及对接口数据的解析方式