swift使用JSPatch要点:

  • 继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法、属性需要加dynamic修饰才可以获得动态性(public属性除外) 例子可参看项目中的:demo1.js, demo1_1.js, demo2.js
  • 纯Swift类没有动态性。也就是说无法重写纯swift类的方法和属性。demo6,demo7
    • JSPatch在进行到overrideMethod进行方法实现IMP替换时要求class实现NSCoping协议,而不继承自NSObject的swift类是不遵循该协议的,因此崩溃。
    • static void _initJPOverideMethods(Class cls) {
      if (!_JSOverideMethods) {
      _JSOverideMethods = [[NSMutableDictionary alloc] init];
      }
      if (!_JSOverideMethods[cls]) {
      _JSOverideMethods[(id<NSCopying>)cls] = [[NSMutableDictionary alloc] init];
      }
      }

    • 此处JSPatch在初始化缓冲区的时候将Class作为Dictionarykey进行保存,而Dictionary在设置key-value时会拷贝 key值,所以会导致给一个不遵循NSCoying协议的对象发送了copyWithZone:消息,导致崩溃。

    • 在github上已有朋友给JSPatch的作者提交了issue,暂时没有什么解决办法,希望swift 3.0出来之后能够有好的解决办法。issue地址
    • swift中runtime相对OC中的runtime动态性大大减弱;objc_msgSend函数无法用于 Swift object,这个导致JSPatch实现方法调用(消息转发)的基础机制在 Swift 中失效了,这也是热修复真正无解的地方,也是最致命的。
  • 同理protocol实现的类也是没有动态性,除非继承自NSObject对像,又回到了上条结论 demo6
  • 对通用性的测试:swift中block的使用,view的简单动画, GCD都是支持的   demo4
    • 注意:block体中如果使用self,比如用var来重新定义变量。GCD,animation在swift和oc中都不需要,但在js中则需要将其self重新定义
  • 扩展遵循其扩展类的动态性  demo5
  • 若方法的参数/属性类型为 Swift 特有(如 Character / Tuple),则此方法和属性无法通过 JS 调用。

总结:

  • 只支持调用继承自 NSObject 的 Swift 类,并且需要使用dynamic关键字标记属性和方法才具有动态性,若方法的参数/属性类型为 Swift 特有(如 Character / Tuple)则无法通过JS调用
  • 多用类方法替代静态方法,使其具有动态性
  • 尽量避免纯Swift类,使用继承NSObject的swift类使其具有动态性
  • 以上几点都是针对Swift APP
  • Demo地址

相关文档:

JSPatch 遇上swift的更多相关文章

  1. MVC遇上bootstrap后的ajax表单模型验证

    MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...

  2. 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

      邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...

  3. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

        我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...

  4. 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)

    邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...

  5. 初识genymotion安装遇上的VirtualBox问题

    想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...

  6. SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案

    SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...

  7. 当创业遇上O2O,新一批死亡名单,看完震惊了!

    当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...

  8. LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)

    当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...

  9. LoadRunner - 当DiscuzNT遇上了Loadrunner(中) (转发)

    当DiscuzNT遇上了Loadrunner(中) 在上文中,介绍了如果录制脚本和设置脚本执行次数.如果经过调试脚本能够正常工作的话,就可以设置并发用户数并进行压力测试了. 首先我们通过脚本编辑界面上 ...

随机推荐

  1. BZOJ 2208: [Jsoi2010]连通数 tarjan bitset

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. C# 中的 lock的陷阱

    旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如: public void ProcessTask(int taskid){     lock(taskid){  ...

  3. zoj 3511 Cake Robbery(线段树)

    problemCode=3511" target="_blank" style="">题目链接:zoj 3511 Cake Robbery 题目 ...

  4. 【VBA研究】怎样将单元格数据赋给数组

    作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种.一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句 ...

  5. IOS AutoLayout 文章

    开始iOS 7中自动布局教程(一) 开始iOS 7中自动布局教程(二) 代码的方式自动布局 自动布局时计算Cell高度

  6. 高级进程间通信之基于STREAMS的管道

    基于STREAMS的管道(简称STREAMS管道,STREAMS pipe)是一个双向(全双工)管道.单个STREAMS管道就能向父.子进程提供双向的数据流. 将http://www.cnblogs. ...

  7. 《C和指针》之ANSI C标准输入输出函数

    一.I/O流操作一般流程: (1)为每一个要打开的文件定义一个FILE *类型的指针变量,这个指针变量将指向I/O流使用的FILE结构体. (2)使用fopen函数打开I/O流.要打开一个I/O流,必 ...

  8. Qt之遍历文件夹

    关于Qt操作文件夹.文件的知识用途较多,比如遍历下一层乃至所有子孙文件.文件夹,获取它们的一些信息(大小.类型.最后更改时间等).当然,也可以进行级联删除.     首先看简单的:   一.Qt遍历文 ...

  9. struts2.1笔记06:struts2开发环境的搭建实际操作出现的问题

    1.我根据新建一个struts工程之后,启动报错,如下: 六月 29, 2015 3:08:18 下午 org.apache.catalina.core.AprLifecycleListener in ...

  10. 转摘:常用ubuntu 关机,重启,注销命令

    1.关机命令 shutdown 好像ubuntu的终端中默认的是当前用户的命令,只是普通用户,因此在终端器中可以使用sudo -sh 转换到管理员root用户下执行命令. 1).shutdown –h ...