更自然的解决字典数组插入nil而导致crash
最近在优化项目虽说小优化一直在持续,大版本的优化也进行了两个版本了但是bug列表依旧血淋淋的摆在那里。有的看一眼也能找到问题所在但是有的就是想破头也不知道问题在哪里,毕竟整个项目经过了N个人的手代码风格迥异阅读起来也会有不小的困难,因此在这分享一下解决这些个bug之间遇到的问题和一些看似实用的方法。
首先是字典中插入nil
和数组中插入nil
以及数组的越界问题
有人就会说在插入之前和取数组元素之前判断一下不就解决问题了吗?
那么你在字典中插入数据可能就是类似这样的写法:
NSMutableDictionary *mDict = [NSMutableDictionary dictionary];
[mDict setObject:(string ? : @"") forKey:@"key"];
也许大家会有这种想法:何必在这这么判断呢?写一个公共方法或者宏不就比这个简洁吗,事实确实如此,然而代码中过多的使用宏会在预处理阶段消耗大量的时间从而削弱用户体验,也不知道是什么原因导致在swift
中直接就取消了宏这个东西
同样的在数组中添加元素也是类似的写法:
NSMutableArray *marr = [NSMutableArray array];
[marr addObject:(string ? : @"")];
获取数组中的元素可能会是这样子的:
if (index < marr.count) {
NSString *elem = marr[index];
} else {
NSLog(@"越界了");
}
上面这样写在实际项目中完全没有问题,而且也是最简单最暴力的写法,然而人类的创造力是无限的,当然了作为程序员的我们更是有着一颗想要通过自己的双手去改变世界的心(然而也只是想想并没有什么卵用),自然而然的就会衍生出各种各样的写法,比如将获取数组元素修改为下面这个样子:
@interface NSArray (NHAdd)
- (id)objectOrNilAtIndex:(NSUInteger) index;
@end @implementation NSArray (NHAdd)
- (id)objectOrNilAtIndex:(NSUInteger) index {
return index < self.count ? self[index] : nil;
}
@end
看到这里我相信大家都松了一口气,再也不用写上面无聊反复的判断了,只要在获取数组元素的时候调用上面分类的方法一切崩溃问题都会迎刃而解。
然而现实总是残酷的,残酷的现实如下:
- 调用上面分类的方法那么就意味着我们再也不能像这样
marr[2]
来获取数组的元素,只能通过调用objectOrNilAtIndex:2
来获取元素,在某种意义上来说会降低代码的可读性,当然了苹果也是推荐我们使用更为简单直观的方法来实现功能。
- 笔者在一开始就说过如果一个项目是经过了N个人的✋,那么由于当时的大环境影响不可能在每个取数组元素的地方都是这么写的,那么在没有处理过的地方就有可能会crash掉,那么就有人会说把相应的地方替换一下不就可以了吗?世上无难事只怕有心人,替换当然是可以的,但前提是你得给我一年的时间
更自然的解决字典数组插入nil而导致crash的更多相关文章
- ASP.NET MVC与Sql Server交互,把字典数据插入数据库
在"ASP.NET MVC与Sql Server交互, 插入数据"中,在Controller中拼接sql语句.比如: _db.InsertData("insert int ...
- iOS UI08_tableView省市区字典数组
北京 1 北京市 1 西城区 1 东城区 2 崇文区 3 宣武区 4 朝阳区 5 丰台区 6 石景山区 7 海淀区 8 门头沟区 9 房山区 10 通州区 11 顺义区 12 昌平区 13 大兴区 1 ...
- JSONModel 嵌套字典数组 JSONModel nest NSDictionary NSArray
JSONModel 嵌套字典数组 JSONModel nest NSDictionary NSArray
- 解决div里插入img下边缝隙问题
<html> <head> <title> new document </title> <meta name="author ...
- JS中遍历普通数组和字典数组的区别
// 普通数组 var intArray = new Array(); intArray[0] = "第一个"; intArray[1] = "第二个"; fo ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- 解决PLSQL Developer 插入中文 乱码问题(转)
原文地址:解决PLSQL Developer 插入中文 乱码问题 PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字 ...
- js 将一个数组插入到另一个数组的方法
JavaScript将一个数组插入到另一个数组的方法.分享给大家供大家参考.具体分析如下: 1.通过Array.prototype.push.apply方法将一个数组插入到另外一个数组,下面的代码将数 ...
- MySQL root密码忘记后更优雅的解决方法
MySQL root密码忘记后更优雅的解决方法 https://www.jb51.net/article/143453.htm /usr/bin/mysqld_safe --defaults-file ...
随机推荐
- 《Java从入门到放弃》入门篇:hibernate查询——HQL
不知不觉又到了hibernate的最后一篇了,只感觉时光飞逝~,岁月如梭~! 转眼之间,我们就···························,好吧,想装个X,结果装不下去了,还是直接开始吧· ...
- 我读《通过Go来处理每分钟达百万的数据请求》
我读<通过Go来处理每分钟达百万的数据请求> 原文 原文作者为Malwarebytes公司的首席架构师Marcio Castilho http://marcio.io/2015/07/ha ...
- Linux学习总结(十三)—— CentOS用户组管理:创建用户组、修改用户组、删除用户组
文章首发于[博客园-陈树义],请尊重原创保留原文链接. 在Linux系统里,有两个系统文件与用户组密切相关,它们分别是:/etc/group./etc/gshadow. /etc/group:存储了用 ...
- 运维之linux基础知识(一)
运维之linux基础知识(一) 1.GUI:Graphic User Interface 图形用户界面 2.CLI:Command line Interface 命令行界面 3 dll:Dynamic ...
- MySQL的常用SQL语句.md
修改密码 这是常见的大家一般都要用的 首先 安装成功了打开cmd --> mysql -u root -p -->输入你的密码 修改mysql root用户密码 格式 ...
- JVM堆内存设置
今天碰到了一个题目,讲的是关于堆内存的问题,题目如下 下面哪种情况会导致持久区jvm堆内存溢出? A.循环上万次的字符串处理 B.在一段代码内申请上百M甚至上G的内存 C.使用CGLib技术直接操 ...
- css中滚动条样式的设置
参数说明: 1.overflow-y : 设置当对象的内容超过其指定高度时如何管理内容:overflow-x : 设置当对象的内容超过其指定宽度时如何管理内容. 参数: visible:扩大面积以显示 ...
- ORACLE中seq$表更新频繁的分析
在分析ORACLE的AWR报告时,发现SQL ordered by Executions(记录了按照SQL的执行次数排序的TOP SQL.该排序可以看出监控范围内的SQL执行次数)下有一个SQL语句执 ...
- 一个利用pojo类从前端页面request中获取参数的小框架~
写之前不知道Spring已经实现这样的功能,所以傻傻的写了这个东西! 实现原理挺有趣的在此记录一下.从去年十月参加java开发以来自己终于有了点小进步. 好开心. 解决问题(详解):前端form表单提 ...
- Oracle 11g的安装
选择对应版本的Oracle 11g: 解压之后,点击"setup.exe"进行安装. 如果希望接受Oracle的广告邮件可以留下自己的电子邮件地址, 如果希望通过My Oracle ...
- ASP.NET MVC与Sql Server交互,把字典数据插入数据库