iOS 组件化方案探索

2016-3-18 评论(80) 分类:技术文章 Tags:

看了 Limboy(文章1 文章2) 和 Casa (文章) 对 iOS 组件化方案的讨论,写篇文章梳理下思路。

首先我觉得”组件”在这里不太合适,因为按我理解组件是指比较小的功能块,这些组件不需要多少组件间通信,没什么依赖,也就不需要做什么其他处理,面向对象就能搞定。而这里提到的是较大粒度的业务功能,我们习惯称为”模块”。为了方便表述,下面模块和组件代表同一个意思,都是指较大粒度的业务模块。

一个 APP 有多个模块,模块之间会通信,互相调用,例如微信读书有 书籍详情 想法列表 阅读器 发现卡片 等等模块,这些模块会互相调用,例如 书籍详情要调起阅读器和想法列表,阅读器要调起想法列表和书籍详情,等等,一般我们是怎样调用呢,以阅读器为例,会这样写:

(更多…)

JSPatch 近期新特性解析

2016-3-14 评论(8) 分类:技术文章 Tags:

JSPatch 在社区的推动下不断在优化改善,这篇文章总结下这几个月以来 JSPatch 的一些新特性,以及它们的实现原理。包括脱离锁的 performSelectorInOC 接口,支持可变参数方法调用,给新增方法指定类型的 defineProtocol 接口,支持重写 dealloc 方法,以及两个扩展 JPCleaner 和 JPLoader。

performSelectorInOC

JavaScript 语言是单线程的,在 OC 使用 JavaScriptCore 引擎执行 JS 代码时,会对 JS 代码块加锁,保证同个 JSContext 下的 JS 代码都是顺序执行。所以调用 JSPatch 替换的方法,以及在 JSPatch 里调用 OC 方法,都会在这个锁里执行,这导致三个问题:

  1. JSPatch替换的方法无法并行执行,如果如果主线程和子线程同时运行了 JSPatch 替换的方法,这些方法的执行都会顺序排队,主线程会等待子线程的方法执行完后再执行,如果子线程方法耗时长,主线程会等很久,卡住主线程。
  2. 某种情况下,JavaScriptCore 的锁与 OC 代码上的锁混合时,会产生死锁。
  3. UIWebView 的初始化会与 JavaScriptCore 冲突。若在 JavaScriptCore 的锁里(第一次)初始化 UIWebView 会导致 webview 无法解析页面。

(更多…)

不可能

2016-3-12 评论(2) 分类:随记

20年前电脑战胜国际象棋冠军时,很多幻想者开始幻想电脑以后如何拥有人类的思想,以后如何统治人类,自从我学习计算机后,就对这些幻想者嗤之以鼻,因为我知道了计算机程序的大致原理,只不过是一些逻辑和循环运算组成,能战胜国际象棋冠军主要是因为计算能力强速度快,象棋每一步可能的情况又很少,计算机可以穷举,再加上一些逻辑策略的优化可以战胜世界冠军,这种能力跟人类大脑完全不沾边,没有半毛钱关系。从战胜象棋冠军就开始幻想计算机可以拥有人类一样的思想,当时觉得这些想法很傻很天真。

直到5年前我看到一本书《人工智能的未来》,这本书阐述了大脑的工作原理,以及用计算机模拟这种工作原理,造出真正与人类大脑接近的人工智能的可能性,让我叹为观止,我一直觉得不可能的事情,原来是可能的,只不过因为我自己的无知和低水平,对计算机的认知停留在已有的范式上,又觉得大脑高深不可测,才觉得这是不可能的。

这种学潮持续发展,到今天计算机的机器学习领域已经很热门,就在今天基于机器学习的 AlphaGo 对围棋世界冠军李世石第三局结束,3-0领先,5-0几乎没有悬念,让人始料未及。10年前看漫画《棋魂》,台词说到计算机可以轻易赢象棋冠军,但要赢围棋冠军,至少得100年后,这也是大家普遍的观点,因为围棋的复杂度跟象棋不在一个量级,结果计算机10年就达到了这成就。按我理解围棋是特定领域,即使在围棋上赢了世界冠军,离真正的人类大脑还有很大差距,但已经不敢嘲笑幻想者们对这种可能性的想象了,这真是可能发生的事。

我们经常基于自己的经验,很轻易地说一些事情不可能,如果我生活在五六十年代,肯定会觉得计算机大规模应用不可能,它只不过提供了一些二进制运算和数字存储能力,怎么可能面向大众提供工作娱乐功能,但硬件半导体的发展跟软件开发的分层思想让这些成了可能。Google 佩奇说,“有一类事情,人们公认不可能实现,如果你不动手去做,它也就真的不会发生。”很佩服所有致力于把这些不可能的事变成可能的人。人与人之间的差距巨大,“改变世界”在我们发展中国家不过是一句忽悠台词,而他们是真正在实践。生活在这个时代很幸福,很期待未来的世界。

JSPatch 平台介绍

2016-3-10 评论(4) 分类:作品

JSPatch 是一个 iOS 开源项目,只需在项目中引入极小的引擎,即可让 APP 拥有实时修复 bug 以及动态运营的能力,目前已得到广泛应用,据年前统计,已经有 1200+ 个 APP 接入 JSPatch。

JSPatch 的使用需要后台下发脚本,需要搭建后台,对脚本进行版本管理和分发,这对于很多中小 App 来说是很麻烦的事,很多小 App 甚至没有后台。另外 JSPatch 脚本权限很大,对于脚本的下发还需要考虑好安全问题,否则会有安全隐患。这导致 JSPatch 使用的门槛有点高。

JSPatch 平台 (http://jspatch.com)就是为了解决这个问题的,它可以让开发者无需自己搭建后台,也无需考虑安全问题,只需在平台注册上传脚本,App 接入 SDK 即可使用 JSPatch 为自己的 App 提供动态能力,降低 JSPatch 的使用成本。

接入 JSPatch 平台 SDK 的 App 需要在每次启动或每次唤醒时访问服务器询问是否有脚本更新,这些请求汇集到一个平台上后平台的请求量和流量都会很高,对服务器的性能和并发要求也很高。JSPatch 平台把脚本的分发逻辑转为静态文件,架构在七牛云存储上,云存储在分发静态文件上是高并发高稳定性的,所以平台在性能上没有问题,可以支持任意用户数的 App 接入并保证稳定性。

解决了服务器性能问题,还有资源消耗的问题。大量的请求会消耗不少云服务资源,而这些资源并不是免费的,需要有一定的投入。所以去年做完平台后一直没有开放注册,而是通过发邀请码的方式控制用户数量,也就一直没改进和推广。随着 JSPatch 的发展,近期还是想放开注册,同时想做一个尝试:收费。学习各个云平台,提供一定免费额度,超出的再按服务器的成本价收费,解决资源消耗问题。收费上简化为只对请求次数收费,无视带宽/存储/流量,实际上计算出来的费用是很低的,并且免费额度也足够支撑大部分 App,应该很容易接受,具体可见这里

欢迎试用 JSPatch 平台,有问题可以直接邮件 bang590@gmail.com

广州碧桂园住户感受

2016-2-28 评论(5) 分类:生活

前年五月开始入住广州碧桂园,至今接近2年,写写在这里住的感受到的它的优点和缺点,以及吐槽下一些做得不好的地方。

优点

  1. 每一栋楼都是七层小楼,人口密度不大,小区宽敞开阔,绿化好,内部还有小公园,广场舞都集中在小区公园跳,不扰民,道路楼梯都有人打扫,绿化也有人修理,整体干净整洁,环境上确实不错。
  2. 小区安全,出入门禁稍严,定期有保安巡逻,没听说过有偷盗事件,管理上除了下面吐槽的那些,其他还不错。
  3. 建筑质量好,99年建的房子,外表看起来还很新,内部也没什么大问题,至今没发现质量问题。
  4. 门口俱乐部有巨大的游泳池,夏天爽爽的,此外还有烧烤场、网球场、篮球场、羽毛球场,感觉不错。
  5. 公共交通还不错,走路到地铁,也有不少公交。

(更多…)

回应一下 JSPatch 安全问题

2016-1-30 评论(4) 分类:互联网

今天收到不少人给我发这篇新闻《曝苹果应用商店逾千款iOS应用存安全漏洞》,以及其他媒体转载或翻译的一些类似的新闻(1 2),每次我都要解释一遍,比较累,写篇文章说说具体情况。

起因是网络安全公司 FireEye 发表了一篇 JSPatch 安全研究报告,里面介绍了 JSPatch 的使用,并指出一些潜在的危害,分三种情况:

1.开发者自己本身有恶意,在自己开发的APP里加上 JSPatch 引擎,用户安装后开发者自己下发恶意脚本,可以做一些恶意的事情。但这里做恶意事情的权限并没有超出iOS的沙盒,也就是说,有没有用 JSPatch 开发者能做的事是一样的,没有 JSPatch 开发者同样能在代码里实现好恶意功能,通过苹果审核后再开启,所以这条挺废的。

2.开发者接入的一些第三方 SDK 里包含了 JSPatch,SDK 的作者再对这些 APP 下发恶意脚本。这种需要开发者防范,避免使用一些恶意 SDK,目前还没有发现有这样的恶意 SDK。

3.开发者自己在 APP 接入 JSPatch,若开发者没有针对传输的 JSPatch 脚本加密。攻击者就通过网络传输的中间人攻击手段下发恶意脚本到用户APP。这点确实比较危险,接入 JSPatch 时请做好加密传输,只要做 RSA 非对称加密传输就不会有问题。加密方式可以参考之前的文章《JSPatch 部署安全策略》,以及项目自带的 JPLoader 实现。

除了以上这三种情况,接入 JSPatch 的 APP 没有其他问题。据了解大部分使用 JSPatch 的 APP 都已经做好非对称加密,并没有什么安全风险。FireEye 上提到 1200 多个 APP 接入 JSPatch,上述媒体文章直接断章取义成上千款 iOS 应用存在安全漏洞,不知道是看不懂原文,还是 KPI 压力的产物。

博客十年

2016-1-14 评论(8) 分类:生活

2006年1月14日,我在闪吧开了个博客,写下第一篇文章,内容很短相当于现在的微博,当时我自己还觉得会三分钟热度,结果持续写了十年。十年前还在上着高二,捣鼓着flash,用着IE,玩着CS,看着CRT显示器,拿着山寨功能机,如今这些都是古董了。当时因为玩 flash 经常逛闪吧和闪客帝国,嫌当时如日中天的新浪博客样式太丑自由度太低,就在闪吧开了博客,直到09年才自己租空间搭了个wordpress。闪吧虽然很快没落了,但网站竟然一直保留着,没有变过,真是难得,还可以上去怀旧一把。

十年以来在这个博客发了四百多篇文章,用它吐槽生活,发表随想,发布作品,分享技术,收获不少,写博客可以针对一个主题完整思考,是记录也是创作,对个人很有好处。现在流行的微博朋友圈都是快销品,写了什么以后不会再去看它,博客不一样,现在回头看以前写的博客,还挺有意思,很多想法和见闻都记录下来了,很让人怀念。这个博客也算我的一个完整作品,很喜欢这个作品。

回顾我的博客,大致可以分成三个阶段。

第一个阶段 06-08 年,写了很多生活琐碎事,很多内容短得像现在的微博,算不上“博客文章”,这个时期可以看到一个敞开心扉的少年日常碎碎念,有时一些情绪也发上去了,像现在的“树洞”一样,因为放心周围不会有人看到我写的东西,是我的一大私人吐槽地,有些现在看起来还挺搞笑的。

第二个阶段 09-11 年,博客写得最多的时期,逐渐有人看了,也逐渐尝试写长的有主题的文章,推出“推特中文圈”后带来不少读者,当时 Google Reader / RSS 还流行着,大家都会订阅去看,写之前开始会考虑到“这是有人看的文章”,但又没有什么束缚,正值大学最自由信心最满的时期,写了一些我自己比较喜欢的文章,也有几篇被传播得较多的文章,感觉是这个博客最美好的时期。

第三个阶段 12-15 年,开始工作了,多了很多束缚,很少写生活的内容,也没那么多时间,技术文章占了大多数,勉力支撑。其实我并不喜欢在这里发太多技术文章,有时很想回到以前的状态,多写一些生活和随想,但发现已经做不到了。

十年以来做到每个月至少一篇博客,可惜的是大学入学军训那一个月没有机会发博客,只有那一个月漏掉了,有空再把当时军训期间手写的日记发上,补全这个缺口,让这个博客完满。

2015

2015-12-31 评论(7) 分类:生活

照例在12月31日写年终回顾。

工作

JSPatch

我一直热衷于做各种东西,从以前的网站FLASH游戏,到推特中文圈,到伊书等APP,一直喜欢这种做一个完整产品的感觉,算是我一大爱好。之前做的都是实际使用的产品,今年的捣鼓多了种类型:开源项目,对我来说开源项目也是一个完整的产品。

JSPatch 可以说是压力下的产物,做这么久技术都没有什么拿得出手的东西,有些捉急,年初就在琢磨做个什么东西,最初的想法是既然 OC 都可以动态调用和替换方法,那可以试试做个东西让 JS 传信息过来去调用和替换方法,这样就可以实时下发脚本修复bug了,产生这个念头的时候我还不知道有 waxPatch 这个开源库,真是孤陋寡闻,后来真正动手做时才知道,不过发现它已经年久失修,而且 JS 又有语言和自带引擎的优势,觉得值得一试,就开始做了。

匆匆把第一个版本放上 github 后,得到很不错的反响,让我有些始料未及,于是投入更多精力去完善它和运营它,不断改进核心代码,日渐完善。产品上除了核心代码,在测试用例和文档上也下了不少功夫,开源项目要真正让人使用,文档必须完善,核心代码只是开源项目的一部分,周边的配套完善后才能是一个完整的开源项目。运营上主要靠技术文章,先后发表了四五篇 JSPatch 相关文章,对开源项目来说写技术文章是个不错的推广方式,再加上微博和一些技术文章平台助力,效果不错。另一种常见的推广方式是技术演讲,这个还没尝试去做,主要是我个人不太擅长。比较遗憾的是我英文水平不行,没法用同样的推广方式推广到国外。

JSPatch 核心上我觉得最重要的就是一个点子和一个理念。点子就是在运行 JS 前用正则替换代码模拟函数转发,这一点是做这个库最大的瓶颈,也可以说是这么久都没出现这样一个库的原因之一,这个原理很简单,但现实世界中很多事物追溯到源头就是一个小点子。理念是保持整个库的精巧简洁,JSPatch 开源以来经历过两百次代码提交,在不断完善的过程中还是保持了极小的代码量,一千多行 OC 和接近两百行 JS,在加功能和修改功能时的代码量和整洁度是我很看重的一个点,让项目接入无压力,尽量让整个库保持精简小而美,是我的一点小追求。

除了主程序,另外还做了两个外围产品:JSPatch 代码自动转换工具JSPatch 服务平台,代码自动转换工具花了一周时间做,过程比较烧脑,做完挺有成就感,虽然有些特性不支持,但用起来还是挺好的。JSPatch 服务平台提供了托管 JSPatch 脚本的后台,封装了脚本下发逻辑,可以让中小 APP 不用搭建后台也能很容易用上 JSPatch,不过后续一直没找到可持续发展路线,导致一直在内测状态,没有投入多大精力在上面。

至今 JSPatch 在开源社区运作得还算不错,github 上已有 3200+ star,虽说 github star 已通货膨胀,但还是能反映一些热度的。另外也得到不少开源社区的帮助,已有17个人参与开发,Q群交流也有300多人,没有统计到有多少产品使用 JSPatch,做了个页面让使用的人自愿提交,使用的朋友可以有兴趣可以提交下:http://using.jspatch.org

JSPatch 相对 wax 有较多优势,有自信可以说是 iOS 动态修复 bug 最佳解决方案,接下来会继续改善一些小缺陷。对于下一步发展计划,我一直想让 JSPatch 不止用于修复 bug,还可以用于动态添加模块,相对于 ReactNative 它还是有优势的,就是对客户端开发的同学来说学习成本低,延续 OC 的开发思维就行。不过年末忙碌导致最近没时间在这上面花精力,也还没找到比较好的路子,后续再研究研究。

APP

今年没有做一个新 APP,比去年更疏于打理,因为时间精力都用在其他方面了,也没想出什么比较想做的产品。对于已有的 APP,某天想起来更新个版本,结果运气极差,说我的 APP 可以下载音乐被拒,被拒也就算了,老的版本竟然直接被下架,直接从AppStore下架!简直对审核人员无语,折腾了个把月才恢复,已是元气大伤,真是时运不济,命途多舛,不过这样的状况也可以让我抛弃过往重新尝试新的玩法,希望接下来能玩得好。

公司

掐指一算,今年竟然是我第一次在腾讯工作满一整年,往年都是各种间断。工作上迎来毕业以来最大的顺境,一扫阴霾,自我感觉状态不错,拿了2次优秀员工,顺利晋级T3,下半年开始也不焦虑了,工作也算开心。

产品上做的是微信读书,去年就开始做的产品,今年8月才上线,过程比较曲折。产品理念上我是很认同的,就是不想做 another book reader,若跟其他读书 APP 没有区别就没必要做了,所以会有一些别的读书APP没有的尝试,这也是为什么捣鼓那么久才上线的原因之一。但是细节上走了不少弯路,费了挺多时间和资源,还有一些不可控力量,各种拍脑袋,希望接下来能克服这些困难把这个产品做起来。

生活

生娃

年末诞下小女生一枚,当爸爸了,正式从二人世界变成家庭生活,影响确实是很大,结婚对生活没多大影响,有孩子就不一样了,很多时候要围绕着孩子转,小孩前几个月应该是最辛苦的,不乖的时候日夜哭闹,我因为要上班还好,最辛苦的还是当妈妈的,还有专门过来照顾的老妈,真是不容易。

变成家庭生活后,两代人的代沟也就逐渐显示出来,对带小孩的方式会有不同意见,总结起来,代沟最大的就是四个字:温饱迷信,似乎每个奶奶都会怕孙子吃不饱穿不暖,可能是上个年代物质匮乏导致,会特别注重这两点,导致有时过了,另外小孩一有不乖的情况,就会怀疑是不是一些风水迷信方面的缘故,我们表示不信就会有一些摩擦,再加上观念固定,说服不了对方,比较难搞。

小家伙出生俩月体重涨了一倍,长势喜人,有时看着觉得很神奇,年初还没有,年末就长这么胖了,还挺可爱,最近几天已经能跟我有些互动了,逗她偶尔会笑,很期待再过一两个月能跟她玩耍,小孩三岁以内是最美好的,希望接下来能多些时间陪她度过这段美好的时光。

车子

有小孩有就开始考虑买个车,我对车不怎么感冒,如果没小孩应该是不会那么快买的,现在买车也不是什么大事了,相对于房子车实在太便宜。当时对车一窍不通,挑车只看外貌,在朗动/福克斯/雷凌中选,最后选了丰田雷凌,中规中矩的车。买完后开的次数较少,半年多过去才2K公里,上班的地方没停车位,比较蛋疼,偶尔去市区也不会开,因为停车费比打车费还贵,论便宜肯定还是不买车只打车便宜,特别是现在有滴滴打车,不过自己偶尔自由地开开车感觉还是挺爽的。

旅游

有了小屁孩,基本宣布跟旅游告别至少两年:(,本来计划去日本,现在遥遥无期了。今年两次出行,都算不上旅游,年中第一次自驾游去了下南沙,自驾游感觉挺不错的,不过南沙比较一般,能玩的地方很少,就去吃吃喝喝走走散散心。另外公司旅游去了下澳门,全因耗时短还能顺便买奶粉才选澳门,十分坑爹,对澳门印象不太好,可能我本来就对赌博印象不好吧,澳门也确实没什么值得游玩的,印象就是路很窄,房子很贵,导游很拜金,充满一种俗气。赌场也跟想象的不太一样,没什么吸引力,转两圈没玩,只在附近商场逛逛了事。只能说,今年旅游方面有些憋坏了。

股市

今年年初股市大热,我也跳入这个坑,结果大家都能猜到了,当时亏到无心工作。A股倒是不亏不赚,主要是港股的坑太大,真是杯具,还好没有投入特别多,像我这样什么都不懂进入股市其实跟赌博差别不大,不应该这样玩的,但环境的影响实在太厉害,迷失了,以后还是要注意点。

其他

因为做微信读书,导致我看书也变多了,看了28本书,不过光《新宋》就占了11本。读书相关的已另写了篇博客,就不再说了。电影倒是看得少了,因为有了小孩,影院也去不了了,在家也没什么娱乐时间,算下来只看了12部,有印象的就只有《大圣归来》。上下班路上还是继续听电台,还是听矮大紧和罗胖,外加了个吴晓波,几乎每一期都听了,感觉还是增长不少见识的,虽然大部分都忘了。

今年几乎都没有锻炼,只有寥寥几次游泳和羽毛球,还好身体还算争气,没出现什么病。明天开始要好好锻炼~

今年博客写得更少了,只有两篇非技术文章,扯淡扯得少了,要是没有“每月至少一篇”的承诺,可能就这样荒废了。小事都写在日记上,日记已连续写了2122天,已成一种习惯停不下来,大多时候写是为了不破坏这个连续性。

2016照旧没什么计划,希望在自由/体验/创造这三点上有更多收获。

读书

2015-11-28 评论(6) 分类:随记

近一年来在做微信读书,导致自己看书也多了些,看了《新宋》系列十几本,东野圭吾的几部经典作品,以及一些杂七杂八的社科类书。

第一次接触《新宋》这样的设定,可以说是穿越小说,也可以说是架空历史小说,讲的是在宋朝王安石变法这个中国历史转折时期,如果矫正变法的弊端,用上现代化的思想和制度去改革会是怎样,包括改善纺织生产,重商言利,创办现代化学校,引入数学物理知识格物致知,写书办报掌握舆论,兵器研究生产火药,探索南海扩张海上贸易,改良青苗法等系列法例,充分考虑当时人的接受程度,循序渐进,中间有很多君臣间,权臣间的博弈,在权术描写上很靠谱。假想在宋代这个史上读书人地位最高,言论最自由的时期,又有锐意改革意图大展宏图的君主,若有合适的方法,会产生什么样的繁荣。虽然不是历史,但也能看到那个时代的社会风貌,士大夫阶层的气节,在宋朝之后包括今天都不再有了。这书最大的缺点在于太拖沓,特别是对战争的描写十分冗长,并且还未完结,另外整部书都十分理性,缺少感情上的描写,没有多少值得回味的地方。

另外东野圭吾系列中,印象最深的是《白夜行》,也是他的代表作,虽然很阴暗,但很多细节和情感丰富细腻,描述方式平淡又很有震撼力,很能影响人心境,看完有不少可以回味的地方,好的小说就是这样吧,上一次有这种感觉的书还得追溯到《三体》和《挪威的森林》。

社科书籍方面,最近看的《人类简史》可以说是我最喜欢的书籍Top3,作者以绝对理性的方式阐述人类的发展史以及宗教/金钱/国家/信念/欲望这些重要事物的由来,内有大量毁三观的观点,虽然不能让人全部赞同,但让人大开眼界,绝对推荐。

现在要看完一本书有点难度,因为看书已经不算是休闲娱乐了,需要用点脑,而现在大多数人从事脑力劳动,脑子都快不够用了,休闲时喜欢做一些不用动脑的事,例如刷微博朋友圈看鸡汤玩休闲游戏,闲了还要耗脑去看书确实不是什么好差事。日常休闲娱乐是要的,但分点精力给看书还是有不少好处的,小说可以给你不一样的体验和想象,好的小说还会留下余味,而社科类非小说书籍多少可以增长点见识,满足好奇心,避免被一些人牵着鼻子走。应该大部分人都认可读书有益的观点,只是时间不知不觉就被微博朋友圈吸走了。既然读书被大众认同是好的,只是不如无脑娱乐那么轻松,那如果要做一个新型读书产品,我觉得应该是要给读书多一些额外的乐趣和鼓励,以此吸引人多读书,对抗无脑娱乐,像微信读书的每周读书时长排名就是一个例子,一些健身产品也是这种思路,希望后续可以做出更多的尝试。

JSPatch Convertor 实现原理详解

2015-10-13 评论(9) 分类:技术文章 Tags:

简介

JSPatch Convertor 可以自动把 Objective-C 代码转为 JSPatch 脚本。

JSPatch 是以方法为单位进行代码替换的,若 OC 上某个方法里有一行出了bug,就需要把这个方法用 JS 重写一遍才能进行替换,这就需要很多人工把 Objective-C 代码翻译成 JS 的过程,而这种代码转换的过程遵循着固定的模式,应该是可以做到自动完成的,于是想尝试实现这样的代码自动转换工具,从 Objective-C 自动转为 JSPatch 脚本。

方案 / Antlr

做这样的代码转换工具,最简单的实现方式是什么?最初考虑是否能用正则表达式搞定,如果可以那是最简单的,后来发现像 方法声明 / get property / NSArray / NSString 等这些是可以用正则处理的,但需要匹配括号的像 block / 方法调用 /set property 这些难以用正则处理,于是只能转向其他途径。

Antlr

接下来的思路是对 Objective-C 进行词法语法解析,再遍历语法树生成对应的 JS 代码。Objective-C 词法语法解析 clang 可以做到 ,但在找方案过程中发现了 antlr 这个神器,以及为 antlr 定制的几乎所有语言的语法描述文件,更符合我的需求。antlr 可以根据语法描述文件生成对应的词法语法解析程序,生成的程序可以是 Java / Python / C# / JavaScript 这四种之一。

也就是说,我们拿 ObjC.g4 这个语法文件,就可以通过 antlr 生成 Objective-C 语法解析程序,程序语言可以在上述四种语言中任挑,我挑选的是 JavaScript,生成的程序可以在 [这里] 看到。官方文档有生成的流程和使用方法,可以自己试下。
(更多…)