Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleEntr...

1.起因

最近接手了一个项目, 某功能完成了一半, 我接着开发那种. 然后遇到了上面的bug. 有点累, 就不卖关子啦, 直接说吧. 全局断点是get不到这个崩溃的, 但是我们看log, 提示是"字典类型调用了objectindex:方法". 我们知道字典类型nsdictionary是没有这个objectinde:方法的, 所以顺着这个思路去找吧.........蓝鹅, 原项目代码超级多, 而且别人的风格也不熟悉, 找啊找啊, 各种搜, 最后花了小半天时间老眼昏花才找到了. 出于保密原因, 原项目代码是不能贴出来的. 这里我模拟了上面的崩溃供大家参考.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleEntr..._第1张图片
崩溃的截图

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 *)touches withEvent:(UIEvent *)event{
    
    NSArray *tempArr = self.arr01[5];
    
    [tempArr objectAtIndex:2];
    
}

为了更直观, 这里贴个截图:


Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleEntr..._第2张图片

3. 原因分析

主要原因在上面的截图已经说了, 这里说的主要是OC语言的特性, 这个崩溃在编译的时候并没有报错, 因为在第二部分里面调用objectindex方法的是tempArr, 编译阶段是正确的. 但是, OC是个运行时语言, 在跑起来的时候, 实际上从self.arr01取出来的却是nsdictionary类型的对象, 所以就崩溃了.

4. end

你可能感兴趣的:(Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleEntr...)