我正在参加「·启航方案」


​ 调试是程序是开发过程中必不可少的环节,每当咱们完结一段代码或许发现一些问题都需求对程序进行调试。高效的调试能帮咱们节约许多的开发时刻。这篇文章我将共享一些提高调试功率的东西和它们的使用办法。

在开发iOS APP的时分咱们最频频进行调试的莫过于UI了。

一、UI的调试

​ 开发中咱们经常需求屡次修正UI元素的款式进行微调,检查作用并确定正确的数值。

  • Xcode

    如下图所示,Xcode 提供了完备的UI调试东西。

1.png

​ 在左面,咱们可以看到完好对视图树,中间有各个视图对3D拆分展示,右边,可以看到当前选中的视图的一些信息。

Xcode在进行UI调试的时分,会暂停APP,视图的信息也只能检查不能便利的修正。在UI调试的时分需求修正代码然后从头编译运转才能看到终究的作用。

在频频调试UI款式的时分是很消耗时刻的(如果电脑性能十分好可能会消耗的时刻可能会短一些)所以这不是最佳的挑选。

  • LookIn

    在这里向咱们介绍一款视图调试东西Lookin,它是由腾讯的QMUI团队开发并开源的一款免费的UI调试东西。

有了它,咱们就能进行高效的UI调试。

​ 使用办法也十分简略,具体可以检查官方的集成指导。

​ 接下来我将分几点简略的介绍一下这个东西的强壮功用。

  • 检查与修正UI

    Lookin 可以检查与修正 iOS App 里的 UI 目标,相似于 Xcode 自带的 UI Inspector 东西,不需求从头编译运转。而且借助于“控制台”和“办法监听”功用,Lookin 还可以进行 UI 之外的调试。

preview_cn_2x.jpg

  • 独立运转

    此外,尽管 Lookin 主体是一款 macOS 程序,它亦可嵌入你的 iOS App 而单独运转在 iPhone 或 iPad 上。

sec6_2x.png

  • 显现变量名

    Lookin 会显现变量名,以及 indexPath 等各种提示。

sec1_cn_2x.png

  • 显现手势

    添加了手势的 UIView,或添加了 Target-Action 的 UIControl,左边都会被加上一个小蓝条,点击即可检查信息或调试手势

events_2x.png

  • 测距

    按住 Option 键,即可丈量任意两个 view 之间的间隔

measure_2x.png

  • 导出文件

    经过手机或电脑将当前 iOS App 的 UI 结构导出为 Lookin 文件以备之后检查,或直接转发给他人。

    当测试发现BUG时可以完美对固定现场,并可以将文件发送给开发者检查其时的视图结构。

二、热重载

💉Injection III

​ Lookin已经帮咱们处理了许多问题,但当咱们修正了代码的事务逻辑,或许修正了UI的加载逻辑,或许对代码进行了比较大的改动,此时还是需求从头编译运转才能使新的代码生效。同样会消耗许多时刻编译、从头运转、点击屏幕抵达刚才修正的页面的时刻。

​ 这个时分便是咱们的第二款高效开发的得力助手上台的时分了。

​ 它便是 💉 Injection III,一款开源免费的热重载东西。

​ Injection III 是一款能在iOS开发时完成相似Web前端那样热重载的东西。他会监听代码文件的改动,当代码产生改动,他会将改动的部分主动编译成一个动态链接库,然后动态的加载到程序中,达到不重启APP直接热重载的目的。

​ 下面我简略介绍一下如何使用它。

​ 咱们可以在 Mac App Store 上下载InjectionIII。打开后会在状态栏有一个蓝色的注射器图标,挑选Open Project 打开工程所在目录开端监听咱们的文件更改。

2.png

接下来在工程中进行一些配置,

Xcodebuild settingOther Linker Flags 中添加-Xlinker -interposable

AppDelegateapplicationDidFinishLaunching办法中加入如下代码:

#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的相关信息

3.png

一起状态栏的图标也会变为红色。此时阐明Injection启动成功。

4.png

接下来你就可以修正一下代码,并保存,Injection会主动编译并主动将其注入到模拟器中运转的APP。控制台也会打印相关的信息。

5.png

一起,它会为被注入的类提供一个回调@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进行安装。

三、写在最终

有用的东西许多,找到一款既强壮又好用的东西,而且把它用好可以很大的提高咱们开发的功率。

希望咱们能喜欢我共享的这两款东西,希望它们能为咱们带来功率的提高。