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

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类型的对象, 所以就崩溃了.

4. end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,712评论 8 265
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,269评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,085评论 25 709
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,362评论 0 11
  • DAY7 早上走进洗手间的时候,窗外的绿叶轻轻的送来一阵微风,久违的秋风沁人心脾。早起的决心更加坚定,早起的清晨更...
    青衣雨翼_shape阅读 162评论 0 0