关于使用JSPatch重写setter方法
来源:互联网 发布:淘宝店如何提升销量 编辑:程序博客网 时间:2024/06/07 07:30
本博客迁移来自:http://www.jianshu.com/users/465865c268ed/latest_articles
今天快下班时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”几个字眼明显就该想到是调用先前的方法啊,我傻了我,还纠结这么久)。。。。记录一下,提醒自己下次细心点。
- 关于使用JSPatch重写setter方法
- 关于重写getter的方法和setter方法
- 重写setter与getter方法以及其使用情况
- iOS Objective-C 重写 setter 方法
- ios 同时重写setter和getter方法
- iOS积累-为什么使用属性之后, 同时重写setter,getter方法会报错
- 同时重写属性的getter/setter方法和readonly的使用
- MRC下setter、getter方法写法、重写dealloc方法
- [iOS diary]关于重写setter覆盖property时,出现exc_bad_access
- JSPatch使用
- JSPatch使用
- iOS ARC MRC情况下重写setter getter方法
- iOS ARC MRC情况下重写setter getter方法
- 告警exc_bad_access copy assign 重写setter方法时
- iOS-OC为什么需要重写setter或getter方法?
- iOS ARC MRC情况下重写setter getter方法
- Swift3.0 -- didSet(OC中重写setter方法)
- iOS MRC情况下重写setter getter方法
- ORM——基本思想
- MyBatis中xml文件中模糊查询的写法
- SVN更新的时候前面的U与G是什么意思?
- js apply和js call方法详解
- 如何抑制索引的使用
- 关于使用JSPatch重写setter方法
- java 简单的工厂设计模式
- Git-- .gitignore忽略规则概述
- 何甘霖 js的基本数据类型和typeof的关系
- 究竟什么样的leader是称职的?
- 关于学习SpringMvc整合QuartZ定时管理任务的持久化管理
- win7与VMware ubuntu虚拟机实现文件共享(最后一定要装open-vm-dkms插件)
- 使用JDBC的连接数据库的步骤和DAO模式的使用
- layer弹出层使用之select标记