viewDidLoad 和 loadView 的区别,并且viewDidLoad可能被调用两次(或者多次)

      快哭了很久没有写过博客了,今天特意将自己在项目中修复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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值