ios 如何设计一个安全的数据或者数据容器
如何设计一个安全数组
首先我们要知道数组有哪些不安全
1.数组为空
2.数组越界
3.数组一边执行删除一边执行添加
4.多线程访问,修改数组
5.数组排序后的同等元素下标index错乱
6.数组的遍历时候通过下标移除崩溃
7数组指定的元素类型但是被其他开发者引入了其他类型
一、首先1.2.7我们可以单独对数组进行判断,也可以在自己自定义的数组类内部进行判断
比如:
-(id)objectAtIndex_zmm:(NSUInteger)index
{
if(self.count == 0){
return nil;
}
if(index >= self.count){
return nil;
}
return[self objectAtIndex:index];
}
二、指定的数组为NSMutableArray array通过isKandof判断,不符合类型直接返回,禁止其他操作
三、数组一边执行删除一边执行添加 可以单独对数组进行加锁,一个线程维护一个任务
内部也可以封装一个runloop,实时监控该数组被那个线程使用的线程状态,如果线程状态没有取消或者完成,正在执行,则退出新的操作
四 数组排序后的同等元素下标index错乱 使用稳定的排序算法,堆排序、快速排序、希尔排序、直接选择排序是不稳定的排序算法,而冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
其次我们在声明数组的时候,如果确定只有单个线程去访问该数组,那么可以使用nonatomic来修饰,但是不确定或者知道可能有多个线程来访问的话,那么使用atomic来修饰,但是同时我们知道atomic是实现了一个互旋锁,而锁机制虽然能做到一个线程去处理一个事物,但是对性能上则出现了损耗。
所以,我们能否在NSMutableArray内部去处理一下多线程访问的东西呢
这里就是数组的内部设计
首先我们有必要先了解一下GCD的栅栏函数以及用法
https://www.jianshu.com/p/e4d5b26b6a36
五 最重要的是如何在数组内部设计一组安全接口来进行多线程的访问
https://www.jianshu.com/p/4195209e4d8e
思想就是对于引发值的改变的行为,让一个任务执行完,在递交给其他任务,这样每个任务维护的都是自己想要的结果。