为JSPatch添加NSInteger,BOOL,CGFloat,double类型的地址传递解析

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的值在使用的时候需要处理一下,其他的类型的值都是可以正常使用的