更自然的解决字典数组插入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企业微信开发_03_通讯录同步
一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取 ...
- php数组和正则表达式的替换拆分匹配所有
正则表达式 $s = "a1s2d3f1g5f";//echo preg_replace("/\d/","#",$s); //替换 //$ ...
- 关于error C2872: 'LONG_PTR' : ambiguous symbol
今天用VS2010创建了一个add-in工程,使用常量INVALID_HANDLE_VALUE时,编译器就提示如下错误: error C2872: 'LONG_PTR' : ambiguous sym ...
- css盒子边框样式
边框样式有全边框和单个边框样式,可对每条边设置不同的样式 如下代码P1为全边框样式,P2为单个边框设置不同的样式: <!DOCTYPE html> <html lang=" ...
- Bug列表
1.Space is not allowed after parameter prefix ': 这个问题主要原因是Hibernate不能识别SQL语句中的":="导致的网上有其他 ...
- 3_初学sql注入
sql注入的分类:布尔型 报错型 可联合查询型 多语句查询型 基于时间延迟注入 1.注释符 # /* -- 2.过滤空格注入 使用/**/或()或+代替空格 3.多条数据显示 concat(str1, ...
- uval 6657 GCD XOR
GCD XORGiven an integer N, nd how many pairs (A; B) are there such that: gcd(A; B) = A xor B where1 ...
- Response.Write 、RegisterClientScriptBlock和RegisterStartupScript总结
Response.Write .RegisterClientScriptBlock和RegisterStartupScript总结 Page.ClientScript.RegisterStartupS ...
- [2012-05-31]awk记录分割符RS
$awk -v RS= '{print $1}' test RS 默认值为\n 换行符. 此处设置RS= 等效于 RS="" 代表一个空行 (若理解有误请指正,在以下例子中符合) ...
- jmeter系列-------脚本调试
1.调试的时候 可以只跑需要调试的接口,禁用其他的接口 2.每个接口都需要增加断言眼,保证脚本的结果的正确性 3.验证脚本的可靠性,可以切换用户(测试变量)来进行调试 4.使用Debug Sample ...
- ASP.NET MVC与Sql Server交互,把字典数据插入数据库