今天快下班时APP出现一个bug,是由于数组越界造成的,在根据月份去判断当月有几周时接口那边多返回了一周(本来五周返回了六周),导致数组越界。由于是先填写周再查询,这个崩溃是崩在查询里(所以肯定是填写时周数算法出错),所以也不清楚是安卓端的算法出错还是PC端的算法出错,但我能很肯定不是iOS端的错误(实力甩锅)。认真检查了我的算法,发现根据月份计算周数并没有问题,然后安卓那边也检查了一遍,也没有问题。这时刚想把锅甩给PC端,PC端的童鞋也说算法没问题。。顿时没人接锅了啊。。。但崩溃的是我iOS端啊(安卓有万能的try catch大法使它不崩啊)。好吧,无奈背锅吧。。。好在我们有万能的JSPatch,还不至于要发一个新的版本来解决这么一个小问题。
涉及到这个算法的页面还挺多的(封装的不够),如果涉及到得每个方法都用JSPatch重写一遍的话工程量也太大了。这里我在想有没有什么一劳永逸的方法呢,从数据的源头入手解决而不不修改下游数据的处理算法。恩,那就从接口获取数据转model时开始吧,没错,重写setter方法。由于获取到得是一个数组,那么很显然,重写model中week这个数组的setter方法。
前几天在swift代码中也这么干过http://www.jianshu.com/writer#/notebooks/2806206/notes/6736829
今天出错的是OC代码,针对
setModel : function(model){
_model = model
}
代码_model = model的处理时,我当时从JSPatch的issue中看到有人说使用 self.ORIGsetModel(model)即可,当时也没有验证,就一直这么用。前几天文章中提到的修复Swift代码bug中也是这么用的却没有出现什么问题,但今天我用的时候发现了一个很严重的问题,就是JS代码在走到 self.ORIGsetModel(model)这个方法时,它突然去调用原生原来的方法了(那就等于白写了这个方法。
其实问题就出在今天的setter方法中我是要先对数据进行处理然后再赋值给_model,而之前和昨天的代码中我是无需对model先处理的,一上来先使用self.ORIGsetModel(model)方法,它调用原生方法后对后面我添加的方法并没有影响。。。。。先上今天的代码吧。
defineClass('WGMonthlyReportModel',{
setWeek: function(week) {
var viewModel = WGMonthPlanWriterViewModel.alloc().init();
var weekCount = viewModel.calculateAmountWeekForThisMonth();
var arrCount = week.count();
var index = 0;
for (index = 0; index < arrCount; index++) {
var weekModel = week.objectAtIndex(index);
var ID = weekModel.ID().integerValue();
if (ID >= weekCount) {
weekModel.setID(weekCount);
}
}
if (week.count() > weekCount) {
var weeArr = NSMutableArray.alloc().init();
var i = 0;
for (i = 0; i < arrCount - 1; i++) {
var weekModel = week.objectAtIndex(i);
weeArr.addObject(weekModel);
}
//注释的是出错的代码
// self.ORIGsetWeek(weeArr);
self.setValue_forKey(weeArr,"_week");
return;
}
//注释的是出错的代码
//self.ORIGsetWeek(week);
self.setValue_forKey(week,"_week");
}
},{});
通过代码很清楚的知道,我对week数组先处理了一同,然后又使用self.ORIGsetWeek(week)想实现"_week = week"的使用,殊不知此时已调用了原生的setter方法覆盖了前面写的一捅。固正确的方法应该是使用“ self.setValue_forKey”方法实现“_week = week",比如“ self.setValue_forKey(week,"_week")”,修改之后完美解决,愉快的告诉运营的同事:“bug已解决”!(自己接的锅,含泪也要背着啊)。
一直以来犯的错误,今天才猛然发现(其实“ORIG”几个字眼明显就该想到是调用先前的方法啊,我傻了我,还纠结这么久)。。。。记录一下,提醒自己下次细心点。