项目上线有一段时间了,从崩溃日志统计来看,问题主要还是集中在数组越界,因为项目是2个人写的,我并没有时间看summer写的代码,加上自己在写的时候对网络情况的忽视,导致部分页面会因为数组越界导致崩溃。于是添加一个分类,来解决这个问题刻不容缓。
因为代码过多,项目还是相对较大,所以第一反应就是通过runtime交换方法,增加对数组长度及空元素的判断。
关于runtime的方法交换就不写了,实现内容还是比较简单的,记录一下关于NSMutableArray的增删改查就好了。我们可能在项目中涉及到方法有(如果有没有涉及到的,再自己添加就好了):
//增
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
//删
- (void)removeObjectAtIndex:(NSUInteger)index;
//改(可增)
- (void)setObject:(ObjectType)obj atIndexedSubscript:(NSUInteger)idx NS_AVAILABLE(10_8, 6_0);
//改
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
//查
- (ObjectType)objectAtIndex:(NSUInteger)index;
在我们调用上述API的时候,如果没有注意到object是否为空或者index是否越界,程序就会崩溃,而这些元素不单单是有我们控制的,很有可能还和sever有关!
接下来就是方法交换
- (id)mutableObjectIndex:(NSInteger)index{
if (index >= self.count || index < 0) {
return nil;
}
return [self mutableObjectIndex:index];
}
- (void)mutableInsertObject:(id)object atIndex:(NSUInteger)index
{
if (object && index <= self.count) {
[self mutableInsertObject:object atIndex:index];
}
}
- (void)mutableRemoveObjectAtIndex:(NSUInteger)index
{
if (index < self.count) {
[self mutableRemoveObjectAtIndex:index];
}
}
- (void)mutableExchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2
{
if (index1 < self.count && index2 < self.count) {
[self mutableExchangeObjectAtIndex:index1 withObjectAtIndex:index2];
}
}
- (void)mutableSetObject:(id)object atIndexedSubscript:(NSUInteger)index
{
if (object && index <= self.count) {
[self mutableSetObject:object atIndexedSubscript:index];
}
}
- (void)mutableReplaceObjectAtIndex:(NSUInteger)index withObject:(id)object
{
if (object && index < self.count) {
[self mutableReplaceObjectAtIndex:index withObject:object];
}
}
通过上述方法,基本能够保证到数组的安全了,至少在目前的项目中,是能够起到不错的效果的。