JSPatch解析

 1 defineClass(‘JPViewController‘, {
 2   handleBtn: function(sender) {
 3     var tableViewCtrl = JPTableViewController.alloc().init()
 4     self.navigationController().pushViewController_animated(tableViewCtrl, YES)
 5   }
 6 })
 7
 8 defineClass(‘JPTableViewController : UITableViewController <UIAlertViewDelegate>‘, [‘data‘], {
 9   dataSource: function() {
10     var data = self.data();
11     if (data) return data;
12     var data = [];
13     for (var i = 0; i < 20; i ++) {
14       data.push("cell from js " + i);
15     }
16     self.setData(data)
17     return data;
18   },
19   numberOfSectionsInTableView: function(tableView) {
20     return 1;
21   },
22   tableView_numberOfRowsInSection: function(tableView, section) {
23     return self.dataSource().length;
24   },
25   tableView_cellForRowAtIndexPath: function(tableView, indexPath) {
26     var cell = tableView.dequeueReusableCellWithIdentifier("cell")
27     if (!cell) {
28       cell = require(‘UITableViewCell‘).alloc().initWithStyle_reuseIdentifier(0, "cell")
29     }
30     cell.textLabel().setText(self.dataSource()[indexPath.row()])
31     return cell
32   },
33   tableView_heightForRowAtIndexPath: function(tableView, indexPath) {
34     return 60
35   },
36   tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {
37      var alertView = require(‘UIAlertView‘).alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles("Alert",self.dataSource()[indexPath.row()], self, "OK",  null);
38      alertView.show()
39   },
40   alertView_willDismissWithButtonIndex: function(alertView, idx) {
41     console.log(‘click btn ‘ + alertView.buttonTitleAtIndex(idx).toJS())
42   }
43 })
;(function(){try{\ndefineClass(‘JPViewController‘, {\n  handleBtn: function(sender) {\n    var tableViewCtrl = JPTableViewController.__c(\"alloc\")().__c(\"init\")()\n    self.__c(\"navigationController\")().__c(\"pushViewController_animated\")(tableViewCtrl, YES)\n  }\n})\n\ndefineClass(‘JPTableViewController : UITableViewController <UIAlertViewDelegate>‘, [‘data‘], {\n  dataSource: function() {\n    var data = self.__c(\"data\")();\n    if (data) return data;\n    var data = [];\n    for (var i = 0; i < 20; i ++) {\n      data.__c(\"push\")(\"cell from js \" + i);\n    }\n    self.__c(\"setData\")(data)\n    return data;\n  },\n  numberOfSectionsInTableView: function(tableView) {\n    return 1;\n  },\n  tableView_numberOfRowsInSection: function(tableView, section) {\n    return self.__c(\"dataSource\")().length;\n  },\n  tableView_cellForRowAtIndexPath: function(tableView, indexPath) {\n    var cell = tableView.__c(\"dequeueReusableCellWithIdentifier\")(\"cell\") \n    if (!cell) {\n      cell = require(‘UITableViewCell‘).__c(\"alloc\")().__c(\"initWithStyle"

  

时间: 2024-11-09 02:53:29

JSPatch解析的相关文章

JSPatch实现原理详解&lt;二&gt;

本文转载至 http://blog.cnbang.net/tech/2855/ 距离上次写的<JSPatch实现原理详解>有一个月的时间,在这段时间里 JSPatch 在不断地完善和改进,代码已经有很多变化,有一些修改值得写一下,作为上一篇的补充. Special Struct 先说下 _objc_msgForward,在上一篇提到为了让替换的方法走 forwardInvocation,把它指向一个不存在的 IMP: class_getMethodImplementation(cls, @se

IOS热更新-JSPatch实现原理+Patch现场恢复

关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IOS应用来说就显得尤其重要. 现在业内基本上都在使用WaxPatch方案,由于Wax框架已经停止维护四五年了,所以waxPatch在使用过程中还是存在不少坑(比如参数转化过程中的问题,如果继承类没有实例化修改继承类的方法无效, wax_gc中对oc中instance的持有延迟释放...).另外苹果对于

JSPatch 实现原理详解

原文地址https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%AF%A6%E8%A7%A3 JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug. 之前在博客上写过两篇 JSPatch 原理解析文章(1 

全面谈谈Aspects和JSPatch兼容问题

1. 背景 Aspects 和 JSPatch 是 iOS 开发中非常常见的两个库.Aspects 提供了方便简单的方法进行面向切片编程(AOP),JSPatch可以让你用 JavaScript 书写原生 iOS APP 和进行热修复.关于实现原理可以参考 面向切面编程之 Aspects 源码解析及应用 和 JSPatch wiki.简单地概括就是将原方法实现替换为_objc_msgForward(或_objc_msgForward_stret),当执行这个方法是直接进入消息转发过程,最后到达替

【腾讯Bugly干货分享】JSPatch 成长之路

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/579efa7083355a9a57a1ac5b Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师.每周都会举行嘉宾分享,话题讨论等活动. 本期,我们邀请了腾讯WXG iOS开发工程师——bang 陈振焯,为大家分享<JSPatch成长之路>. 如何加入 Dev Club? 移动端开发经验 >= 2 年,微信扫描下方群管

JSPatch - 基本使用和学习

介绍 JSPatch是2015年由bang推出的能实现热修复的工具,只要在项目中引入极小的JSPatch引擎,就可以用 JavaScript 调用和替换任何 Objective-C 的原生方法,获得脚本语言的能力<动态更新 APP.替换项目原生代码修复 bug>.作者已将JSPatch商业化,提供了脚本后台托管,版本管理,保证安全传输等功能,只需引入一个SDK(+startWithAppKey:)即可使用.JSPatch Platform 实现原理 JSPatch 能做到通过 JS 调用和改写

C++工程编译之“error LNK2001: 无法解析的外部符号”

今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是,如果使用的第三方函数库编译方式采用/MD,那么主工程也应该使用/MD.我使用了libevent,而主工程默认采用/MT,所以需要忽略一大堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了. 下面引用一篇文章的描述:[Z]VC运行库版本不同导致链接.LIB静态库时发生重复定义

防止恶意解析——禁止通过IP直接访问网站

一.什么是恶意解析 一般情况下,要使域名能访问到网站需要两步,第一步,将域名解析到网站所在的主机,第二步,在web服务器中将域名与相应的网站绑定.但是,如果通过主机IP能直接访问某网站,那么把域名解析到这个IP也将能访问到该网站,而无需在主机上绑定,也就是说任何人将任何域名解析到这个IP就能访问到这个网站.可能您并不介意通过别人的域名访问到您的网站,但是如果这个域名是未备案域名呢?一旦被查出,封IP.拔线甚至罚款的后果都是需要您来承担的.某些别有用心的人,通过将未备案域名解析到别人的主机上,使其

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频