我正在参加「·启航方案」
调试是程序是开发过程中必不可少的环节,每当咱们完结一段代码或许发现一些问题都需求对程序进行调试。高效的调试能帮咱们节约许多的开发时刻。这篇文章我将共享一些提高调试功率的东西和它们的使用办法。
在开发iOS APP的时分咱们最频频进行调试的莫过于UI了。
一、UI的调试
开发中咱们经常需求屡次修正UI元素的款式进行微调,检查作用并确定正确的数值。
-
Xcode
如下图所示,Xcode 提供了完备的UI调试东西。
在左面,咱们可以看到完好对视图树,中间有各个视图对3D拆分展示,右边,可以看到当前选中的视图的一些信息。
Xcode在进行UI调试的时分,会暂停APP,视图的信息也只能检查不能便利的修正。在UI调试的时分需求修正代码然后从头编译运转才能看到终究的作用。
在频频调试UI款式的时分是很消耗时刻的(如果电脑性能十分好可能会消耗的时刻可能会短一些)所以这不是最佳的挑选。
-
LookIn
在这里向咱们介绍一款视图调试东西Lookin,它是由腾讯的QMUI团队开发并开源的一款免费的UI调试东西。
有了它,咱们就能进行高效的UI调试。
使用办法也十分简略,具体可以检查官方的集成指导。
接下来我将分几点简略的介绍一下这个东西的强壮功用。
-
检查与修正UI
Lookin 可以检查与修正 iOS App 里的 UI 目标,相似于 Xcode 自带的 UI Inspector 东西,不需求从头编译运转。而且借助于“控制台”和“办法监听”功用,Lookin 还可以进行 UI 之外的调试。
-
独立运转
此外,尽管 Lookin 主体是一款 macOS 程序,它亦可嵌入你的 iOS App 而单独运转在 iPhone 或 iPad 上。
-
显现变量名
Lookin 会显现变量名,以及 indexPath 等各种提示。
-
显现手势
添加了手势的 UIView,或添加了 Target-Action 的 UIControl,左边都会被加上一个小蓝条,点击即可检查信息或调试手势
-
测距
按住 Option 键,即可丈量任意两个 view 之间的间隔
-
导出文件
经过手机或电脑将当前 iOS App 的 UI 结构导出为 Lookin 文件以备之后检查,或直接转发给他人。
当测试发现BUG时可以完美对固定现场,并可以将文件发送给开发者检查其时的视图结构。
二、热重载
💉Injection III
Lookin已经帮咱们处理了许多问题,但当咱们修正了代码的事务逻辑,或许修正了UI的加载逻辑,或许对代码进行了比较大的改动,此时还是需求从头编译运转才能使新的代码生效。同样会消耗许多时刻编译、从头运转、点击屏幕抵达刚才修正的页面的时刻。
这个时分便是咱们的第二款高效开发的得力助手上台的时分了。
它便是 💉 Injection III,一款开源免费的热重载东西。
Injection III 是一款能在iOS开发时完成相似Web前端那样热重载的东西。他会监听代码文件的改动,当代码产生改动,他会将改动的部分主动编译成一个动态链接库,然后动态的加载到程序中,达到不重启APP直接热重载的目的。
下面我简略介绍一下如何使用它。
咱们可以在 Mac App Store 上下载InjectionIII。打开后会在状态栏有一个蓝色的注射器图标,挑选Open Project 打开工程所在目录开端监听咱们的文件更改。
接下来在工程中进行一些配置,
在 Xcode 的 build setting
的 Other Linker Flags
中添加-Xlinker -interposable
在AppDelegate的applicationDidFinishLaunching
办法中加入如下代码:
#if DEBUG
//for iOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
//for tvOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/tvOSInjection.bundle")?.load()
//Or for macOS:
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle")?.load()
#endif
接下来,编译运转你的APP,此时控制台会打印Injection的相关信息
一起状态栏的图标也会变为红色。此时阐明Injection启动成功。
接下来你就可以修正一下代码,并保存,Injection会主动编译并主动将其注入到模拟器中运转的APP。控制台也会打印相关的信息。
一起,它会为被注入的类提供一个回调@objc func injected()
,当某个类被注入时,会调用该办法。
咱们可以在这里改写UI,就能做到实时更新UI了。
注意事项
尽管Injection很强壮,但它也有许多约束:
-
你可以修正class、enum、struct 的成员办法的完成,但如果是inline函数则不可,如果有这种状况需求从头编译运转。
-
它只支撑模拟器,不支撑真机。
-
你不能修正class、enum、struct的布局(即成员变量和办法的顺序),如果有这种状况需求从头编译运转。
-
你不能添加或删除存储类型的属性和办法,如果有这种状况需求从头编译运转。
更多概况可以拜见官方的阐明:InjectionIII/README.md at main · johnno1962/InjectionIII (github.com)
尽管 Injection III 有许多约束,但它依然能为咱们带来十分大的功率提高。
另一个热重载神器: krzysztofzablocki/Inject
krzysztofzablocki/Inject: Hot Reloading for Swift applications! (github.com)
它合作 Injection III 可以更便利的完成热重载和界面主动改写,完成相似Swift UI的主动改写作用,但是,它只支撑Swift,而且经过Swift Package Manager进行安装。
三、写在最终
有用的东西许多,找到一款既强壮又好用的东西,而且把它用好可以很大的提高咱们开发的功率。
希望咱们能喜欢我共享的这两款东西,希望它们能为咱们带来功率的提高。