问题描述
Java后端在处理完数据返回的时候如果某个键没有值的时候我们拿到的是null,null对应oc或swift中的NSNUll而非我们经常用于判断的nil。由于初次使用时对null的判断不到位导致程序在运行时crash。而报错日志却打出了 [NSNUll length ] 方法非法调用的错误。
定位并解决问题的过程
- 通篇查找调用length方法的位置
- 步骤一未能定位bug位置后仔细定位闪退所涉及到的类一步步跟踪测试最终定位到了,在调用KVC的setValue: forKeyPath:方法给类属性赋值时未能完成全部的调用。最后通过print调试大法最终确定出错属性的key为askReason。使用lldb的po将key所涉及的value通过 as 各种类型观察其返回值后,最终确定原先的判断是否为null的方法并没有生效。经过一番总结后得出了如下的解决方法:
func generateValue(from:[String:Any?]) -> BaseItem {
for key in from.keys{
let v = from[key] as? NSNull
if v == nil{
setValue(from[key]!, forKeyPath: key)
}
}
return self
}
以下为原先没有生效的解决方案
func generateValue(from:[String:Any?]) -> BaseItem {
for key in from.keys{
if let value = from[key],type(of: value) != type(of: NSNull.init()){
setValue(from[key]!, forKeyPath: key)
}
}
return self
}
不过总觉得该方案也不是很完美,如果各位大侠有好的解决方案还请赐教。