更自然的解决字典数组插入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 ...
随机推荐
- C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件..很很很很重要..),附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本篇..基 ...
- Linux安装MariaDB(Mysql)和简单配置
1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...
- 【Java学习笔记之二十八】深入了解Java8新特性
前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...
- 非极大值抑制(Non-Maximum Suppression,NMS)
概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...
- spring boot / cloud (一) 使用filter防止XSS
spring boot / cloud (一) 使用filter防止XSS 前言 XSS(跨站脚本攻击) 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading ...
- c# 后台get post请求
//get请求 public static TResult Get<TResult>(string host, string url) { var httpClient = new Htt ...
- Andrew Ng机器学习课程笔记--week8(K-means&PCA)
Unsupervised Learning 本周我们讲学习非监督学习算法,会学习到如下概念 聚类(clustering) PCA(Principal Componets Analysis主成分分析), ...
- Java设计模式 (转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 如何在Win7安装U盘中加入USB3.0驱动的支持
U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- ASP.NET MVC与Sql Server交互,把字典数据插入数据库