Skip to content

JSPatch常见问题解答

Albert Liang edited this page Jul 30, 2015 · 16 revisions

###一、block使用规则 1、在JSPatch若要向Objective-C传递block时,需要使用block(paramTypes, function)函数封装。

Block的详细使用方法

2、不允许在JS的block中传入含有undefined的数组或对象。比如传入["JSPatch", undefined]的数组或{obj:undefined}的对象,这种语法在Javscript中是没有错误,但是在Objective-C中是不允许的。

3、如果block的参数里含有block,paramTypes需要写成NSBlock *

var blk = block("BOOL, NSBlock *", function(b, blk){
	if (b) {
		blk(true)
	}
})

4、在Objective-C中传入到JSPatch中的Block会转换为function,如果需要再将该Block传回到OC,依旧需要用block(paramTypes, function)封装。

- (void)excuteBlock:(JSBlock)block {
    if (block) {
        block(@"Hello, JSPatch");
    }
}
- (JSBlock)returnBlock {
    JSBlock block = ^(NSString *str) {
        NSLog(@"%@", str);
    };
    return block;
}
var blk = self.returnBlock()
self.excuteBlock(block("NSString *", blk))

###二、在JSPatch中表示nil和[NSNull null]和其他特殊类型 1、在JSPatch中使用nullundefined来表示Objective-C的nil, 使用nsnull表示[NSNull null]

2、在JSPatch中判断Objective-C对象是否为空时,使用if(!obj){}的形式而不能使用if(obj == null){}if(obj == undefined){}

3、在JSPatch中使用struct、selctor的用法可参考这里

###三、调用包含id *类型参数的方法 https://github.com/bang590/JSPatch/wiki/Base-usage#7-passing-id-parameters

###四、在JSPatch使用父类方法 使用self.super()调用父类方法

defineClass("JPTableViewController", {
  viewDidLoad: function() {
     self.super().viewDidLoad();
  }
})

###五、调用多参数的方法 JSPatch中使用_来替代Objective-C中的:,多以调用多参数的Objective-C方法需要像下面这样。

var error = require('NSError').errorWithDomain_code_userInfo("UnKnown_Error", -1, null)

如果调用的方法含有一个下划线,就需要使用双下划线来表示。例如:

- (void)p_privateMethod;

JSPatch中可以这样调用

self.p__privateMethod()

不支持方法中含有双(或更多)下划线的方法,如- (void)p__privateMethod;。 但是如果是要获取含有双(或更多)下划线的property(这种情况比带有双下划线的方法更为常见一些),可以使用KVO的valueForKey方法。 例如:

@property (nonatomic, string) id __privateObject;

JSPatch中可以这样获取

var obj = self.valueForKey("__privateObject")

###六、JSPatch中的NSArray,NSString,NSDictionary 在JSPatch中不能将Objective-C中的NSArray, NSString, NSDictionary与Javascript的Array, String, Object进行混用。

//Objective-C
- (NSArray *)returnArray {
    return @[@"Objective-C", @"Swift"];
}
var nsarray = self.returnNSArray()
var array = ["Objective-C", "Swift"]
//这两者不能混用,因为他们是不同的类型。

var wrongStr = nsarray[0] //得到的是一个不正确的对象,请不要使用取下标的方式获取NSArray/NSDictionar对象。
var rightStr = nsarray.objectAtIndex(0) //使用Objective-C方法获取NSArray/NSDictionary中的对象

具体可参考https://github.com/bang590/JSPatch/wiki/Base-usage#4-nsarray--nsstring--nsdictionary

Clone this wiki locally