博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中的crash防护(二)KVC造成的crash
阅读量:7127 次
发布时间:2019-06-28

本文共 2960 字,大约阅读时间需要 9 分钟。

  接上篇 我们攻克了找不到方法实现的crash,这一篇我这里主要分析一下在KVC常见的crash。以及防护措施。

[object setValue:nil forKey:key]

   value为nil。key不为nil的时候会调用-(void)setNilValueForKey:(NSString *)key这种方法,我这里对这种方法进行重写,代码例如以下:

-(void)setNilValueForKey:(NSString *)key{    NSString *crashMessages = [NSString stringWithFormat:@"JKCrashProtect:'NSInvalidArgumentException', reason: '[%@ %p setNilValueForKey]: could not set nil as the value for the key %@.'",NSStringFromClass([self class]),self,key];    [[JKCrashProtect new] JKCrashProtectCollectCrashMessages:crashMessages];}

測试代码:

NSObject *object = [NSObject new];    [object setValue:nil forKey:@"name"];

执行结果例如以下:

2017-05-04 19:14:14.073 JKCrashProtect_Example[28537:4028815] demo JKCrashProtect:'NSUnknownKeyException', reason: '[NSObject 0x600000003b30 setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key: name,value:(null)'

大家能够看到程序不再产生crash,并且将crash打印信息 出来方便我们定位crash。

非对象属性value为nil产生的crash

实例代码例如以下:

@interface Person : NSObject@property (nonatomic,copy)NSString *name;@property (nonatomic,assign)NSInteger age;@end

測试代码:

Person *jack = [Person new]; [jack setValue:nil forKey:@"age"];

假设我们不进行crash防护的话,上面的这段測试代码就会产生crash,可是进行防护后。执行结果例如以下:

2017-05-04 21:19:52.496 JKCrashProtect_Example[29792:4065383] demo JKCrashProtect:'NSInvalidArgumentException', reason: '[Person 0x608000225560 setNilValueForKey]: could not set nil as the value for the key age.'

程序并没有crash,并且crash信息也被打印了出来,方便我们定位。

key不是object的属性产生的crash

  假设key不是object的属性的话,我们进行KVC赋值操作的话,也是会产生crash的。

測试代码例如以下:

NSObject *object = [NSObject new];  [object setValue:@"abc" forKey:@"123"];

执行结果例如以下:

2017-05-04 21:26:21.357 JKCrashProtect_Example[29942:4071385] demo JKCrashProtect:'NSUnknownKeyException', reason: '[NSObject 0x600000203180 setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key: 123,value:abc'

程序相同没有崩溃。并且将crash打印信息了出来,方便我们定位。

[object setValue:value forKey:nil]产生的crash

   当key为nil的时候程序会产生crash。当然了这里能够通过method swizzle进行处理,可是这违背了,JKCrashProtect创建的初衷:仅仅在crash产生的时候,进行相关的处理,没有crash的时候。程序正常执行。尽可能少的产生性能损耗。这个在静态时,编译器会有警告,一般这个crash产生在动态传入key时未做非空处理,我这边临时没有好的解决方式。假设大家有的话,欢迎大家留言一块讨论哦。

[object setValue:value forKeyPath:keyPath];

   假设keyPath不对,这个时候程序也会产生crash,我这边进行crash防护后。測试代码例如以下:

@interface Country : NSObject@property (nonatomic,copy)NSString *name;@end@interface Person : NSObject@property (nonatomic,copy)NSString *name;@property (nonatomic,assign)NSInteger age;@property (nonatomic,strong)Country *country;@end
Country *country = [Country new];    jack.country =country;    [jack setValue:@"111" forKeyPath:@"abc.name"];

这里keyPath我随便写了一个。执行结果例如以下:

2017-05-04 23:30:20.580 JKCrashProtect_Example[30774:4107964] demo JKCrashProtect:'Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[Person 0x6000004280c0 valueForUndefinedKey:]: this class is not key value coding-compliant for the key: abc

程序并没有crash。并且crash信息也被打印了出来,方便我们定位。

今天要说的就这些了。欢迎大家持续关注哦。

cocoaPod:

pod "JKCrashProtect"

转载地址:http://chhel.baihongyu.com/

你可能感兴趣的文章
CPrintDialog 构造函数参数详解
查看>>
foreign key
查看>>
【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
查看>>
Hbase 参数配置及优化
查看>>
看病要排队(stl)
查看>>
springMVC的controller返回值
查看>>
Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)
查看>>
instance of
查看>>
TOJ 4701 求阴影部分面积
查看>>
TFS命令行操作
查看>>
分披萨
查看>>
激活IDEA 2019.1
查看>>
DedeCMS文章标题前增加所属栏目名称链接
查看>>
[ Luogu 4917 ] 天守阁的地板
查看>>
iOS动画案例(2) 仿网易新闻标题动画
查看>>
OpenCV和Matlab
查看>>
扩展字符集UTF-8
查看>>
简谈如何提高APP的积分墙收入!
查看>>
Metasploit
查看>>
被忽略却很有用的html标签
查看>>