最近用上了JSPatch设褐,好用是好用颠蕴,但是因?yàn)镴S不熟還是踩到許多坑,浪費(fèi)了不少時(shí)間助析。這里做個(gè)記錄犀被,不定期更新。
Block使用
cell.selectBlock = ^(NSUInteger index){
};
上面的代碼換成JS外冀,應(yīng)該是:
var func = function(index){
};
cell.setSelectBlock(block("NSUInteger", func)); //因?yàn)槭莝etter寡键,所以要用set開頭
帶下劃線的變量或方法
看下面的代碼:
var hotgoods_moreurl= dataHome.hotgoods_moreurl();
單步調(diào)試到這一行代碼時(shí)報(bào)錯(cuò):method signature argument cannot be nil。加入JSPatch源碼得到更詳細(xì)的報(bào)錯(cuò)信息:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unrecognized selector hotgoods:moreurl for instance '雪隧。
看到了嗎西轩,本來是訪問hotgoods_moreurl變量的,結(jié)果變成了訪問名為hotgoods:moreurl的selector膀跌。
究其原因遭商,還是因?yàn)樽兞棵杏邢聞澗€,而文檔中說明原OC方法名有下劃線在的捅伤,在JS中要用雙下劃線代替劫流。
還是沒仔細(xì)看文檔惹的禍!!祠汇!
for循環(huán)
for (var constraint in view.superview().constraints()) {}
粗看沒問題仍秤,一用大有問題,在訪問constraint的某個(gè)屬性時(shí)直接報(bào)錯(cuò)并崩潰可很,錯(cuò)誤提示:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'js exception, msg: undefined is not an object (evaluating 'this[methodName].bind')
—— JS里這樣for循環(huán)也是有問題的
歸根到底是JS中的Array與OC中的NSArray是不同的诗力,在js中訪問NSArray中的元素還是乖乖用ObjectAtIndex方法,并使用正常的for循環(huán)方法:
var count = view.superview().constraints().count();
var index = 0;
for (index = 0; index < count; index++) {
var constraint = view.superview().constraints().objectAtIndex(index);
}
比較
viewA和viewB比較在OC里可以用viewA == viewB我抠,但是在JS里進(jìn)行類似的比較卻是會(huì)出問題的苇本,在OC里面相等而在JS里面未必相等。
正確辦法是用isEqual來進(jìn)行viewA和viewB的比較菜拓。