viewDidLoad 和 loadView 的区别,并且viewDidLoad可能被调用两次(或者多次)
2016-09-10 16:52
429 查看
很久没有写过博客了,今天特意将自己在项目中修复bug时遇到的问题分享给大家,也好自己做一下笔记。昨天在修复一个线上崩溃bug时定位到了一个方法,具体crash如下:
从这个crash中可以知道,是找不到boolValue方法导致的问题,咦,这不是系统的方法,怎么会找不到。再定位到具体的位置,方法如下:
用过运行时的,都知道这里进行值绑定的操作,我当时没有明白这里为什么要值绑定,作用到底又是什么;后来只好去问写这段代码的同事,他说这里是防止第二次调用,只是&setupFlagKey后面的那个参数用错了,不应该是self,而是@(YES),这样在第一次执行这个方法时value时nil的,通过下面那句后,value就为YES,所以就不再会往下执行。通过他这么一说,我才算真正明白,也知道了还可以这么干。但是这样做有一个不好的地方,就是如果是多个线程调用的话,并不能保证只执行一次,所以这样的方法适合放在一个线程上,这样才能够达到只执行一次的效果。
后来我接着查找这个方法的调用地方,发现调用这个方法就两处,都是在viewDidLoad方法下;我当时就好奇了,按照我认知的viewDidLoad方法只执行一次,怎么会执行两次或者多次,如果是一次的话,那这样没有必要了呀!后来问了同事,他说是在内存不足时,viewDidLoad有可能被执行两次,好吧,我又长见识了,去网上找了一下资料,确实有这种情况,下面是找到两种解释:
http://stackoverflow.com/questions/1081131/viewdidload-getting-called-twice-on-rootviewcontroller-at-launch
他这里说当堆砌了很多复杂视图的时候,就有可能出现,好吧,我们项目的那个视图确实有非常多的视图。下面是说内存不足时:
http://forums.macrumors.com/threads/viewdidload-getting-called-twice.569074/
不过这个崩溃确实多发生在iOS7系统上,大部分都是iPhone4这样的机器,也算解释的通。
通过这些,自己也马上去查找一下viewDidLoad和loadView的区别。根据Apple官方的文档,我们知道执行顺序应该是这样子的:
loadView将view加载到内存中(self.view == nil时就会调用这个方法,在加载到内存前,self.view肯定是nil的)——》viewDidLoad进一步初始化view(已经加载到内存,说明self.view不为nil,所以可以进行进一步的view的布局)——》viewDidUnLoad(内存不足时,调用这个方法来释放views)——》当需要使用view时又回到第一步
(如此循环);这样就基本可以说viewDidLoad方法是可能被调用两次或者多次的。
参考链接:
https://www.dreamingwish.com/article/correct-online-information-error-loadview-viewdidload-viewdidunload.html
http://www.cnblogs.com/pengyingh/articles/2446768.html
http://blog.csdn.net/likendsl/article/details/7349600
相关文章推荐
- loadView和ViewDidLoad区别
- iPhone loadView 和 viewDidLoad的区别
- ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用
- ViewController里的loadView和viewDidLoad什么区别
- IOS viewDidLoad方法被执行两次(viewDidLoad和loadView方法详解)
- loadView 和 viewDidLoad 的区别
- IOS 开发 loadView 和 viewDidLoad 的区别
- iphone开发中loadView和viewDidLoad的区别
- loadView ,viewDidLoad, viewWillDisappear, viewWillAppear等区别
- IOS loadView 和 viewDidLoad 的区别
- loadView 和 viewDidLoad 的区别
- ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?
- loadView 和 viewDidLoad 的区别
- iphone 备忘录1--loadView 和 viewDidLoad 的区别
- loadView方法的实现(self.view调用addSubview方法与self.view=的区别)
- iPhone loadView 和 viewDidLoad的区别
- loadView 和 viewDidLoad、viewDidunload 的区别
- loadView方法的实现(self.view调用addSubview方法与self.view=的区别)
- ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?
- loadView和viewDidLoad的区别