iOS菜鸟联盟

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 
上一篇下一篇

猜你喜欢

热点阅读