SwiftUI已经出来了一段时间,有幸在最近的一个大项目中使用SwiftUI, 作为现代化的UI框架,以后的趋势,我们iOS开发的同学势必要掌握它,提升自己的竞争力,以至于更好的混口饭吃。

我们使用的是技术栈是SwiftUI与UIKit混编,这样技能使用SwiftUI快速开发UI的便捷,也能使用UIKit成熟的技术框架,比如路由系统…

但是我们在开发的时候很正常,发布sit后,测试人员反馈了一个奇怪的问题,就是当键盘出现后,整个UI就hold住了,无法相应用户事件。关键这这个问题就像是随机出现的一样,有的机器上能复现,有的机器上打死无法复现。

然后我们拿到能复现的机器,连接数据线就开启调试模式。每当用户激活输入框键盘出现的时候,CPU马上100%,内存也在不断增加。当看到内存不断增加的时候,我们第一反应就是内存泄漏。经过各种排斥,各种Profile, 我们没有找到内存泄漏的地方。

查看CPU占有的问题,Profile看到是底层SwiftUI的函数占用的CPU的,但是还是没有找到原因。

然后我们看日志,尝试分析日志。在日志中看到了autolayout约束冲突的日志,其他日志没有什么可用信息。

于是尝试去看一下是否是约束的问题。最后发现还真是约束的问题。最后把约束解决了,就完全OK了。

最后分析了出现问题的流程:
UIkit UIView A上添加一个用UIHostingController包装的SwiftUI B, 给B添加了约束布局。如果B的约束布局冲突了,那么在A上有键盘出现的时候就会导致CPU 100%且内存狂涨的问题。

解决方案就是修复B的约束。

好了问题就这么完美解决!

下一篇我们解决SwiftUI与UIKit混编,SwiftUI点击区域下移的问题!