JSPatch学习笔记

JSPatch 做到了让JS调用/替换任意OC方法,让iOS APP具备hotfix的能力

1.引入执行js脚本

[JPEngine startEngine];

直接执行JS脚本

[JPEngineevaluateScript:@"\

  console.log(‘call JPEngine success‘);\

"];

执行本地JS文件demo.js脚本

NSString *sourcePath = [[NSBundlemainBundle] pathForResource:@"demo"ofType:@"js"];

NSString *script = [NSStringstringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncodingerror:nil];

[JPEngineevaluateScript:script];

2.基本语法

2.1 调用objc方法

//objc方法

UIView *view = [[UIView alloc] init];

//js方法

var view = require(‘UIView‘).alloc().init();

//require(‘UIView‘)会在JS全局作用域上创建一个同名变量,变量指向一个对象,之后调用可直接如下

var view = UIView.alloc().init();

调用含参方法

//objc方法

[view setBackgroundColor:[UIColor redColor]];

//js方法

view.setBackgroundColor(UIColor.redColor());

调用多参数方法

//objc方法

[UIView beginAnimations:nil context:nil];

//js方法

UIView.beginAnimations_context(null, null);//多参数中间用"_"连接

给原方法添加新的代码

//objc

@implementation CustomViewController

- (void) viewDidLoad {

    [super viewDidLoad];

}

@end

// js

defineClass("CustomViewController", {

    viewDidLoad: function() {

        self.ORIGviewDidLoad();

   self.view().setBackgroundColor(require(‘UIColor‘).whiteColor());

    },

})

 

2.2 objc属性

//objc方法

UIColor *color = view.backgroundColor;

view.backgroundColor = [UIColor redColor];

//js方法

var color = view.backgroundColor();

view.setBackgroundColor(UIColor.redColor());

//创建属性

//objc方法

@property(nonatomic, strong)NSArray *data;

//js方法

data: function() {

   var data = self.get_prop(‘data‘);

 if(data) return data;

 var data = [];

 for(var i=0; i < 20; i++){

  data.push("js data "+ i);
 }

 return data;

 }

//属性已下划线开始

//objc

self.set_unserLineString(‘test test test‘);

//js

self.set__underLineString(‘test test test‘);//双下划线

2.3实例变量

//objc方法

@interface CustomObject()

NSString *_string;

@end

_string = @"string";

//js方法

get:

var string = self.valueForKey(‘_string‘);

set:

self.setValue_forKey(‘string‘, ‘_string‘);

2.4字符串、数组、字典

//objc方法

NSString *string = [NSString stringWithString:@"string"];

NSArray *array = [[NSArray alloc] initWithArray:@[@"string0", @"string1", @"string2"]];

NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:@{@"key0":@"value0", @"key1":@"value1",@"key2":@"value2"};

//js方法

var string = ‘string‘;

var array = [‘string0‘, ‘string1‘, ‘string2‘];

var dict = {‘key1‘:‘value1‘,‘key1‘:‘value1‘};

console.log(require(‘NSString‘).stringWithString(string).toJS());//调用toJS()方法将对应方法转化为对应的JS类型

console.log(require(‘NSArray‘).alloc().initWithArray(data).objectAtIndex(0).toJS());

console.log(require(‘NSDictionary‘).alloc().initWithDictionary(dict).objectForKey(‘key1‘).toJS());

2.5Block

//objc方法

@property(nonatomic, copy) NSNumber * (^ addBlock)(NSInteger, NSInteger);

//setter

self.addBlock = ^(NSInteger a, NSInteger b){[email protected](a + b);};

//getter

self.addBlock(1,2);

//js方法

//setter

self.setAddBlock(block("NSInteger, NSInteger", function(a, b){

//getter

var blk = self.addBlock();

blk(1,2);

return a + b;//使用block时,js返回值为NSObject类型,这里返回NSNumber类型

}));

//从JS传block到OC,有两个限制:A. block 参数个数最多支持4个。(若需要支持更多,可以修改源码)B. block 参数类型不能是 double。

//防止循环引用,使用__weak和__strong

var weakSelf = __weak(self);

self.setCustomBlock(block(function(){

var strongSelf = __strong(weakSelf);

strongSelf.customMethod();

}));

2.6GCD

//objc方法

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        dispatch_async(dispatch_get_main_queue(), ^{

        });

    });

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    });

//js方法

    dispatch_async_global_queue(function(){

        dispatch_async_main(function(){            

        });

    });

    dispatch_after(1.0, function(){

    });

时间: 2024-10-24 18:15:11

JSPatch学习笔记的相关文章

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过