iOS 数组越界的处理和优化方案。
2018-04-09 本文已影响132人
走向菜鸟的菜鸟
iOS开发中最常见的列表数据,必须使用数组,但是使用数组总会出现数组越界的情况,下面列出三种优化数组越界的方式。
一、向数组中添加元素的方式优化。
在从服务器请求数据之后,先将所有元素添加到一个临时数组中,然后将这个临时数组添加到数据源数组中或直接覆盖原数组数据。
[[HttpClient shareClient] post:Dynamic_index params:dic suc:^(id results) {
// 列表数据
NSArray *dataArray = [NSArray arrayWithArray:self.dynamicModel.news];
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:1];
for (NSDictionary *dic in dataArray) {
HFDynamicCellModel *model = [HFDynamicCellModel yy_modelWithDictionary:dic];
[tempArr addObject:model];
}
// 优化代码
if (_page > 1) {
[self.dataSource addObjectsFromArray:tempArr];
} else {
self.dataSource = tempArr;
}
[weakSelf.tableView reloadData];
} fail:^(NSString *error) {
}];
二、替换系统原生获取数组中元素的方法。
弊端:使用这种方式会出现新的crash,在iOS7 / iOS8系统上,弹出键盘的界面点击home键返回桌面就会crash,如果项目要适配iOS7 / iOS8系统不能使用该方式。
/*** --------------- .h --------------- ***/
#import <Foundation/Foundation.h>
@interface NSArray (Crash)
@end
/*** --------------- .m --------------- ***/
#import "NSArray+Crash.h"
#import <objc/runtime.h>
@implementation NSArray (Crash)
+ (void)load
{
[super load];
//替换不可变数组方法
Method oldObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:));
Method newObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtSafeIndex:));
method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);
//替换可变数组方法
Method oldMutableObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndex:));
Method newMutableObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(mutableObjectAtSafeIndex:));
method_exchangeImplementations(oldMutableObjectAtIndex, newMutableObjectAtIndex);
}
- (id)objectAtSafeIndex:(NSUInteger)index
{
if (index > self.count - 1 || !self.count) {
@try {
return [self objectAtSafeIndex:index];
}
@catch (NSException *exception) {
NSLog(@"exception: %@", exception.reason);
return nil;
}
}else {
return [self objectAtSafeIndex:index];
}
}
- (id)mutableObjectAtSafeIndex:(NSUInteger)index
{
if (index > self.count - 1 || !self.count) {
@try {
return [self mutableObjectAtSafeIndex:index];
}
@catch (NSException *exception) {
NSLog(@"exception: %@", exception.reason);
return nil;
}
}else {
return [self mutableObjectAtSafeIndex:index];
}
}
@end
三、自定义获取数组元素的方法。
弊端:每次获取元素都要使用自定义的方法。
/*** --------------- .h --------------- ***/
@interface NSArray (HFUtil)
/*!
@method objectAtIndexCheck:
@abstract 检查是否越界和NSNull如果是返回nil
@result 返回对象
*/
- (id)objectAtIndexCheck:(NSUInteger)index;
@end
/*** --------------- .m --------------- ***/
#import "NSArray+HFUtil.h"
@implementation NSArray (HFUtil)
- (id)objectAtIndexCheck:(NSUInteger)index
{
if (index >= [self count]) {
return nil;
}
id value = [self objectAtIndex:index];
if (value == [NSNull null]) {
return nil;
}
return value;
}
@end