Road is underfoot - 。-.
二进制补丁的主要目的是优化JSON补丁,所以先从JSON补丁说起。
OCRunner 最初的时候是打算只使用 Json 补丁的,可当在我能力范围内对JSON补丁进行了压缩以后,发现 Json 补丁的大小仍不能接受的,太多的冗余字符了。在我思考了一段时间后,发现可以使用 Json 补丁的数据结构,以二进制数据的形式来消除这些冗余字符,大幅降低补丁的大小,所以二进制补丁的初衷是为了优化 Json 补丁的冗余字符,所以我们将先从 Json 补丁说起。
在正文开始前,我们先看看给出的语法树解释执行.gif,OCRunner的核心解释执行部分也是如此。
本图出自: 虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩
如果你让我仅仅只靠文字就能给你解释清楚 OCRunner 是怎么运行起来的,你们可能是在为难我小蒋,肚子里墨水真的没那么多啊,太难了😂。所以在这一小节,我给大家准备了一个简单版 OCRunner,希望大家能从这个例子中,真正知道它是如何运行的。
希望你们看见项目中的 SingleEngine 类不要笑(哈哈哈),我只是想表达 单缸发动机 的意思 - _ -,我心爱的小摩托就是单缸拖拉机。
本节假设读者并不具备编译相关的知识。
本文对 lex 和 yacc 介绍有限,关于 flex 和 bison 的详细使用可以参照《flex与bison中文版》或者 《flex&bison》。
Demo源码git clone
的形式下载源码,每个小节的相应源码都对应在各自的 commit 里。通过边看文章边阅读源码的形式食用,更香哟。
在软件开发过程中,很难避免 BUG 的存在,尤其是对于一些达到一定规模的 App 因为协作模式错综复杂,就很容易带着问题上线。
一旦问题上线之后,问题就麻烦了,不仅需要重新打包、测试,而且还需要重新提交审核,而这种修复问题的方式往往是低效且漫长的。
因此,在开发一个 App 的过程中,稳定性的就变成了一个难题,唯一的原因就是不希望带着问题上线导致用户对 App 失去信任。
热修复就可以很好的解决这类棘手的问题,因此带着好奇之心,研究了一下热修复在 iOS 端的可行性,实现 了一个较为完备的热修复框架,我把它叫做 OCRunner。
我也会在未来几个月,把我做 OCRunner 的一些经验总结成博文,在「老司机技术周报」的公众号上与大 家分享。
为了能够实现一篇文章的思路:Objective-C源码 -> 二进制补丁文件 ->热更新(具体是哪篇我忘了)。当时刚好开始了oc2mango
checkra1n
我的手机为iPhone7 13.3.1
在Cydia中搜索安装OpenSSH
确保手机和电脑在同一局域网
ssh -P 22 root@<iPhone局域网IP>
# 默认密码为alpine
设置免密连接
ssh-keygen -t rsa -P '' #如果已经有了id_rsa,跳过这一波
ssh-copy-id -i /Users/username/.ssh/id_rsa root@ip #这里提示错误,添加sudo即可
cargo new {project_name}: 创建新项目
在{project_name}目录下执行:
cargo check: 调用编译器进行语法检查,速度比build更快
cargo build: 编译rust程序
cargo run: 编译并运行程序
安装第三方库
在cargo.toml的dependencies下添加第三方库名字和版本:rand = "0.7.0"
运行cargo build,会自动下载第三库进行下载以及编译
如 rand = "0.7.0",运行cargo update,更新版本的区间为 [0.7.0,0.8.0)
let:不可变变量,和swift中的let一样,不同的在于,可变变量需要使用 let mut a = xx的形式
//rust shadow特点:
fn main(){
let a = 2;
let a = a + 1;
let a = a * 2;
println!("a = {}",a);
}
// 输出: a = 6
// 在其他语言中,通常会有变量已经声明的错误
圆角,可控圆角方向。
边框相关参数,可控边框方向。
阴影相关参数,可控阴影方向。
使用CoreGraphics生成图片,可异步执行。
超小的缓存占用。图片大小与视图大小无关,1000张随机值的圆角阴影边框图片,占用29MB。
这几天被这个坑哭了。
先说说问题。
做Router时,返回的ViewController,push显示了,结果Xcode给你说,self是nil。黑人问号.jpg
解决方式就是判断当前类是否是Swift的类(包含"."),如果是的话Retain一次
const char * returnType = [signature methodReturnType];
if (self.isSwift && returnValue && strcmp(returnType, @encode(id)) == 0){
CFRetain((__bridge CFTypeRef)returnValue);
}
在10.3.1 11.4 12.4 13.3模拟器测试下,对象都能正常销毁。