34 Crash总结(二)NSInvalidArgumentException 异常

NSInvalidArgumentException 异常


1

-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[3]

NSString *password = nil;

NSDictionary *dict = @{

@"userName": @"bruce",

@"password": password

};

NSLog(@"dict is : %@", dict);

出现原因:没有正确将后台返回的数据转为model,提供给对象使用,后台返回的数据有可能为空,就会造成nil对象

三种方案:

方案一:后台在返回数据的时候进行校验,对空值进行处理。但是在项目中有些空值是有特殊的用途,此种方案不可行。

方案二:在转换成NSDictionary的时候,对后台返回的数据进行校验,把空值转换成NSNull对象。方案可行,但是需要对现有代码做大的改动,每次转换的时候都需要进行校验,太麻烦。业务高速发展时期,这样做成本太高。

int 类型的对象转为NSNumber

方案三:有没有一种无须改动现有代码又能解决该问题呢?答案是有的,可以利用Objective-C的runtime来解决该问题

NSDictionary插入nil对象会造成崩溃,但是插入NSNull对象是不会造成崩溃的,只要利用runtime的Swizzle Method把nil对象给转换成NSNull对象就可以把该问题给解决了。创建一个NSDictionary的类别,利用runtime的Swizzle Method来替换系统的方法。

源码实现可以参考Glow团队封装的NSDictionary+NilSafe(Github上可下载到)


2data parameter is nil

NSData *data = nil;

NSError *error;

NSDictionary *orginDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

NSLog(@"originDict is : %@", orginDict);



3 unrecognized selector sent to instance 0x15d23910

一个类调用了一个不存在的方法,造成的崩溃

可以在写一个方法的时候,判断一下其类的类型,不符合类型的不让其调用,也可以使用runtime对常见的方法调用做一下错误兼容。比如我这边经常会出现这样的崩溃:

当这些对象调用这几个不存在的方法的时候,替换成自己定义的一个方法,对它们做一下错误兼容,使应用不会崩溃

总结:造成NSInvalidArgumentException异常大概有以下原因:

NSDictionary插入nil的对象。NSMutableDictionary也是同样的道理。

NSJSONSerialization序列化的时候,传入data为nil。

an unrecognized selector 无法识别的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 代码下载 iOS Crash 杀手排名 杀手 NO.1 NSInvalidArgumentException 异常...
    雷鸣1010阅读 2,516评论 1 3
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 1,449评论 1 27
  • 1.NSInvalidArgumentException 异常 出现这种异常的原因一般是在不可以出现nil数据的时...
    SuperZico阅读 1,053评论 1 0
  • 太焦铁路哦哦哦图啦啦啦噜啦啦啦噜啦噜从科普一下。本轮OK咯女模,LOL魔马恩替我了,两节OK你来我们家科技咯古墓,...
    覃韵覃阅读 318评论 0 0
  • 矩阵: 双曲余弦函数: 排列组合公式: 开方运算: 表格对齐: 特殊符号: 复杂表达式:
    孞言阅读 279评论 0 0