JSPath添加封装
使用场景,针对客户端中常常使用这样的实参形式来保存地址中的值。
// 声明变量a
NSInteger a = 0;
// 取地址a做容器承接值
[self changA:&a];
// 改变a地址中的值
- (void)changeA:(NSInteger *)a {
*a = 10;
}
目前JSPatch中并没有支持这样的替换,需要在JPMemory中手动添加这类类型的解析。针对这一应用场景,我们在JPMemory中添加了如下的解析方法
// 新增开辟地址操作
if ([typeName isEqualToString:@"NSInteger"]) return sizeof(NSInteger);
if ([typeName isEqualToString:@"BOOL"]) return sizeof(BOOL);
if ([typeName isEqualToString:@"CGFloat"]) return sizeof(CGFloat);
if ([typeName isEqualToString:@"double"]) return sizeof(double);
// 新增取地址操作
context[@"pvalNSInteger"] = ^id(JSValue *jsVal) {
void *m = [self formatPointerJSToOC:jsVal];
NSInteger i = *((NSInteger *)m);
return [self formatOCToJS:[NSNumber numberWithInteger:i]];
};
context[@"pvalCGFloat"] = ^id(JSValue *jsVal) {
void *m = [self formatPointerJSToOC:jsVal];
CGFloat f = *((CGFloat *)m);
return [self formatOCToJS:[NSNumber numberWithFloat:f]];
};
context[@"pvalDouble"] = ^id(JSValue *jsVal) {
void *m = [self formatPointerJSToOC:jsVal];
double d = *((double *)m);
return [self formatOCToJS:[NSNumber numberWithDouble:d]];
};
使用举例:
// OC
- (void)handleBtn:(id)sender
{
}
- (void)testNSInteger:(NSInteger *)i tempBool:(BOOL *)b tempFloat:(CGFloat *)f tempDouble:(double *)d {
*i = 10;
*b = YES;
*f = 2.333333;
*d = 4.773729374923942;
}
// JS
require('JPEngine').addExtensions(['JPMemory'])
defineClass('JPViewController', {
handleBtn: function(sender) {
// 为实参变量开辟内存空间
var i = malloc(sizeof("NSInteger"))
var b = malloc(sizeof("BOOL"))
var f = malloc(sizeof("CGFloat"))
var d = malloc(sizeof("double"))
// 运行函数,向开辟的地址中添加数据
self.testNSInteger_tempBool_tempFloat_tempDouble(i,b,f,d);
// 取地址中的值,此操作设计到解包,所以未在JPMemory中添加的解地址函数是不能执行的
var iValue = pvalNSInteger(i)
var bValue = pvalBool(b)
var fValue = pvalCGFloat(f)
var dValue = pvalDouble(d)
console.log("输出NSInteger的值")
console.log(iValue)
console.log("输出BOOL的值")
console.log(bValue)
console.log("输出CGFloat的值")
console.log(fValue)
console.log("输出double的值")
console.log(dValue)
// 释放开辟的地址空间
free(i)
free(b)
free(f)
free(d)
}
})
打印的日志如下
2016-07-28 14:32:36.747 JSPatchDemo[2494:114211] JSPatch.log: 输出NSInteger的值
2016-07-28 14:32:36.748 JSPatchDemo[2494:114211] JSPatch.log: 10
2016-07-28 14:32:36.749 JSPatchDemo[2494:114211] JSPatch.log: 输出BOOL的值
2016-07-28 14:32:36.749 JSPatchDemo[2494:114211] JSPatch.log: 1
2016-07-28 14:32:36.749 JSPatchDemo[2494:114211] JSPatch.log: 输出CGFloat的值
2016-07-28 14:32:36.749 JSPatchDemo[2494:114211] JSPatch.log: 2.333333015441895
2016-07-28 14:32:36.749 JSPatchDemo[2494:114211] JSPatch.log: 输出double的值
2016-07-28 14:32:36.749 JSPatchDemo[2494:114211] JSPatch.log: 4.773729374923942
这里的CGFloat的值在使用的时候需要处理一下,其他的类型的值都是可以正常使用的