1.起因
最近接手了一个项目, 某功能完成了一半, 我接着开发那种. 然后遇到了上面的bug. 有点累, 就不卖关子啦, 直接说吧. 全局断点是get不到这个崩溃的, 但是我们看log, 提示是"字典类型调用了objectindex:方法". 我们知道字典类型nsdictionary是没有这个objectinde:方法的, 所以顺着这个思路去找吧.........蓝鹅, 原项目代码超级多, 而且别人的风格也不熟悉, 找啊找啊, 各种搜, 最后花了小半天时间老眼昏花才找到了. 出于保密原因, 原项目代码是不能贴出来的. 这里我模拟了上面的崩溃供大家参考.
崩溃的截图2. 代码
- (void)viewDidLoad {
[super viewDidLoad];
self.arr01 = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
NSDictionary *dic = @{
@"valueInt" : [NSString stringWithFormat:@"%d", i]
};
[self.arr01 addObject:dic];
}
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSArray *tempArr = self.arr01[5];
[tempArr objectAtIndex:2];
}
为了更直观, 这里贴个截图:
3. 原因分析
主要原因在上面的截图已经说了, 这里说的主要是OC语言的特性, 这个崩溃在编译的时候并没有报错, 因为在第二部分里面调用objectindex方法的是tempArr, 编译阶段是正确的. 但是, OC是个运行时语言, 在跑起来的时候, 实际上从self.arr01取出来的却是nsdictionary类型的对象, 所以就崩溃了.
网友评论