iOS原生代码的编译调试,都是通过一遍又一遍地重启App来进行的。所以,项目代码量越大,编译时间就越长。虽然可以通过将部分代码先编译成二进制集成到工程里,来避免每次都全量编译来加快编译速度,但即使这样,每次编译都还是需要重启App,需要再走一遍调试流程。对于开发者来说,提高编译调试的速度就是提高生产效率。下面介绍一种Objective-C可以使用的调试工具。
Injection for Xcode
John Holdsworth 开发了一个叫做 Injection 的工具可以动态地将 Swift 或 Objective-C 的代码在已运行的程序中执行,以加快调试速度,同时保证程序不用重启。
下载地址:
1:从 App Store 下载,搜索InjectionIII
2:从github下载,作者已经开源了这个工具
https://github.com/johnno1962/InjectionIII
使用方法就是 clone 下代码,构建InjectionPluginLite/InjectionPlugin.xcodeproj;
删除方法是,在终端里运行下面这行代码:
rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/InjectionPlugin.xcplugin
使用方法:
1.设置InjectionIII
打开 InjectionIII 工具,选择Open Project,选择你的代码所在的路径,然后点击Select Project Directory保存。注意是选择代码根目录。
2.设置AppDelegate.m
在 didFinishLaunchingWithOptions 方法中加入下面的代码来加载工具。这些代码用于Xcode10,如果不是Xcode10,把10删掉即可。
#if DEBUG
// for iOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle"] load];
// for tvOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/tvOSInjection10.bundle"] load];
// for masOS
[[NSBundle bundleWithPath:@"/Applications/InjectionIII.app/Contents/Resources/macOSInjection10.bundle"] load];
#endif
3.运行项目
先在 Xcode Command+R 运行一下你的项目,控制台提示如下信息,即表示InjectionIII连接成功,连接成功的话InjectionIII标志会由蓝变橙(可能不同InjectionIII版本颜色不太一样)。
💉 Injection connected, watching /Users/chenzheng/Documents/Code/kaiba_5.0_dev/kaiba_ios/HZCZFW/**
4.调试项目
现在可以修改项目中的代码了,想要让修改的代码生效,只需要让这部分代码再执行一次便可。比如想要修改push出的一个viewController中的内容,只需在模拟器中返回上层页面重新push一次即可,那么无法重新执行的代码该如何生效呢?
工具提供了一个调试方法,- (void)injected ,只要在这个方法中加入代码,Command+S 即可立即执行方法中的代码。
注意事项:
1.InjectionIII工具只对模拟器有效,真机无效。
2.调试时 InjectionIII 的 File Watcher 选项要保持选中状态。
3.如果没有效果,可以排查以下事项
工具是否启动成功,图标是否由蓝色变为橙色
Injection connected 有没有打印,也就是项目是否链接到了工具
如果修改的是cell/item上面的内容,需要上下滚动才能看到效果
如果修改的是一个普通页面的内容,最好是退出这个页面,再进入这个页面
确认Xcode的版本9.3及以上
4.在 injected 方法里面修改的代码,再次 Command+R 运行时不会起作用。因为代码里面只声明了 injected 方法,并没有去调用,所以不会生效;不要忘记将 injected 里面修改的代码移到正确的位置哦。
5.被修改的文件路径中不能带有中文