John Holdsworth 开发了一个叫作 Injection 的工具可以动态地将 Swift 或Objective-C 的代码在已运行的程序中执行,以加快调试速度,同时保证程序不用重启。
使用方法:
1、App Store下载Injectionlll。
2、项目工程配置。
在我们自己的工程 AppDelegate.swift 文件的 didFinishLaunchingWithOptions 方法中进行注入
Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load()
在ViewController里面写入injected方法,swift要写@objc。
@objc func injected() {
viewDidLoad()
self.view.backgroundColor = UIColor.orange
}
写入你想要动态更改的代码
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.lightGray
self.view.addSubview(button)
// 更改约束的时候没有清空之前的约束,会存在两个约束,造成约束冲突,所以先清空。若是不清空的话需要重新进入页面才能生效。
button.snp.removeConstraints()
button.snp.makeConstraints { (make) in
make.centerX.equalToSuperview()
make.top.equalTo(100)
make.height.equalTo(30)
make.width.equalTo(100)
}
button.setTitle("sdddd", for: .normal)
}
3、开启监控。
打开Injectionlll,在菜单栏点击Injectionlll,下拉选中open Project,打开iOS工程目录。
遇到问题:
1、真机,cmd+s无效?
只支持模拟器调试。
2、swift不生效?
在swift中方法injected前要加@objc。
3、frame布局生效,snapkit约束不生效?
更改约束的时候没有清空之前的约束,会存在两个约束,造成约束冲突,所以先清空。若是不清空的话需要重新进入页面才能生效。
原理介绍:
启动了一个mac server监控工程目录,cmd+s的时候,获取injected方法内的代码,生成新的dylib文件,替换旧的动态链接库,实现即时刷新UI。
网友评论