前言:相对于有一定开发经验的猿,这样的奔溃是比较好定位和解决的。
- 问题复现:当我写了这样一段代码时运行时
NSArray *name = @[@"kobe",@"rose",@"jack"];
NSDictionary *dict = @{@"name":name, @"wilson":@"8"};
// 有时候后台会告诉我们,我这里会给你返回一个字典,你尽管这么取值就好了。但实际却并不是这样😔
NSDictionary *testDict = dict[@"name"];
NSString *test = testDict[@"testName"];
NSLog(@"%@",test);
// 奔溃日志
[__NSArrayI objectForKeyedSubscript:]: unrecognized selector sent to instance 0x60000024fb40
Terminating app due to uncaught exception 'NSInvalidArgumentException'
reason: '-[__NSArrayI objectForKeyedSubscript:]: unrecognized selector sent to instance 0x60000024fb40'
从日志我们得到,对一个数组使用了objectForKeye方式取值,编译器识别不了,抛出异常。
- 解决:需要做一层安全行判断:
id testDict = dict[@"name"];
if ([testDict isKindOfClass:[NSDictionary class]]) {
NSString *test = testDict[@"testName"];
NSLog(@"%@",test);
}
我们平时写代码时,需要注意对数据类型的判断,防止类似情况发生奔溃。在与后台协调好数据结构的前提下,还需要尽可能做一些安全性测试,比如数组或字典为空会不会崩溃?这都需要大量的代码积累,开发之路路漫漫兮。