iOS中的crash防护(二)KVC造成的crash
2017-05-04 21:38
387 查看
接上篇《 iOS中的crash防护(一)unrecognized selector sent to instance》 我们解决了找不到方法实现的crash,这一篇我这里主要分析一下在KVC常见的crash,以及防护措施。
测试代码:
运行结果如下:
大家可以看到程序不再产生crash,并且将crash信息打印 出来方便我们定位crash。
测试代码:
如果我们不进行crash防护的话,上面的这段测试代码就会产生crash,但是进行防护后,运行结果如下:
程序并没有crash,而且crash信息也被打印了出来,方便我们定位。
测试代码如下:
运行结果如下:
程序同样没有崩溃,而且将crash信息打印了出来,方便我们定位。
这里keyPath我随便写了一个,运行结果如下:
程序并没有crash,而且crash信息也被打印了出来,方便我们定位。
今天要说的就这些了,欢迎大家持续关注哦。
demo地址
cocoaPod:
[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信息也被打印了出来,方便我们定位。
今天要说的就这些了,欢迎大家持续关注哦。
demo地址
cocoaPod:
pod "JKCrashProtect"
相关文章推荐
- iOS中的crash防护(二)KVC造成的crash
- iOS中的crash防护(三)KVO造成的crash
- iOS中的crash防护(四)NSNotificationCenter指定线程接收通知
- iOS中的crash防护(一)unrecognized selector sent to instance
- iOS小问题----数据请求未完成造成的crash问题(AFN)
- iOS crash log report tools
- IOS 高级开发 KVC(一),ios开发kvc
- iOS Crash收集框架
- ios开发答疑录系列---xcode 经常crash 当使用svn时候
- [iOS Crash文件分析]-如何使用symbolicatecrash工具
- iOS开发系列--Objective-C之KVC、KVO
- 调试iOS 已经发布代码 Crash 文件分析出出错对应代码
- 问题:iOS 10 权限Crash问题
- iOS Crash 捕获及堆栈符号化思路剖析
- 利用dwarfdump 分析IOS crash
- iOS 根据 crash 崩溃 报告的内存地址定位到代码位置
- iOS KVC、KVO、通知
- iOS开发工具——统计Crash的工具Crashlytics
- iOS开发之通知中心、KVC、KVO
- iOS开发工具——统计Crash的工具Crashlytics