美文网首页
makeKeyAndVisible 和 makeKeyWindo

makeKeyAndVisible 和 makeKeyWindo

作者: 三三哥 | 来源:发表于2020-02-24 00:02 被阅读0次

今天写个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 就不太明白了。估计得苹果那边工程师才能解释出具体细节。

总结一下:

平时开发其实这些细节都是不怎么注意,直到偶尔的因素才能发现其实自己还是有很多东西没掌握。学无止境,学无止境!!!

相关文章

网友评论

      本文标题:makeKeyAndVisible 和 makeKeyWindo

      本文链接:https://www.haomeiwen.com/subject/ilzeqhtx.html