今天写个demo 发现一个有趣的事(Xcode 版本是11.3.1)。Demo 大概流程是:
无意间 将 self.window.rootViewController 放在了 [self.window makeKeyAndVisible]的后面
结果发现 vc 的viewDidLoad 走调用了两遍
第一遍的函数调用栈是:
可以发现 调用的是 ScenDelegate scene:willConnectToSession:options:里面的 [self.window makeKeyAndVisible]函数 触发了 TextKitViewController 的loadView,通过调用栈可以很清楚的看到。
viewDidLoad 走的第二遍流程是:
可以发现走的是我们希望的正常流程,从UINavgationController 里面触发的。
通过再仔细阅读makekeyandVisiable 文档解释结合第一次触发的函数调用栈可以得到一个间接答案:
makekeyandVisiable 让当前的window成为keyWindow并且显示出来。这句话理解一下:
window显示出来,window 最上层想加载的view 其实是TextKitViewController的view。但是此时 self.window.rootViewController 还没赋值,理论上window 应该不知道它需要加载的view。但实际情况却是加在了TextKitViewController 的view。
有一定理由怀疑是不是系统层面处理 window 上的view 流程有些问题。现在再回过头来看第一次加在的函数调用栈的图
上面几个标红的个人理解就是 系统调用makekeyandVisiable 时候发现rootViewController 没有,就自动的添加UIViewController ,最后为什么会调用TextkitViewController 就不太明白了。估计得苹果那边工程师才能解释出具体细节。
总结一下:
平时开发其实这些细节都是不怎么注意,直到偶尔的因素才能发现其实自己还是有很多东西没掌握。学无止境,学无止境!!!
网友评论