iOS开发遇到Crash: [__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance

前言:相对于有一定开发经验的猿,这样的奔溃是比较好定位和解决的。

  • 问题复现:当我写了这样一段代码时运行时
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);
}

我们平时写代码时,需要注意对数据类型的判断,防止类似情况发生奔溃。在与后台协调好数据结构的前提下,还需要尽可能做一些安全性测试,比如数组或字典为空会不会崩溃?这都需要大量的代码积累,开发之路路漫漫兮。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,250评论 25 709
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,776评论 0 13
  • 同学们: 大家好! 上个月我参加了第二届广东祠堂文化研讨会,对祠堂有了一点认识,今天给大家聊一下。 广州有丰富的民...
    闲蛋侠阅读 3,978评论 0 2
  • 当产品团队走完第一阶段和第二阶段的流程后(这里简化了第二阶段的流程),就进入视觉稿设计阶段,此阶段产品会受到来自设...
    罗摩_职业产品人阅读 2,833评论 0 0

友情链接更多精彩内容