zoukankan      html  css  js  c++  java
  • 防止数组越界处理

    1、不可变数组

    #import "NSArray+ArrayCheck.h"
    #import <objc/runtime.h>
    @implementation NSArray (ArrayCheck)
    + (void)load{
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:));
            Method toMethod = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndexCheck:));
            method_exchangeImplementations(fromMethod, toMethod);
        });
    }
    
    
    - (id)objectAtIndexCheck:(NSUInteger)index {
        if (self.count-1 < index) {
            // 异常处理
            @try {
                return [self objectAtIndexCheck:index];
            }
            @catch (NSException *exception) {
                // 打印崩溃信
                NSLog(@"---------- %s Crash Because Method %s  ----------
    ", class_getName(self.class), __func__);
                NSLog(@"不可变数组异常%@", [exception callStackSymbols]);
                return nil;
            }
            @finally {}
        } else {
            return [self objectAtIndexCheck:index];
        }
    }
    @end
    

     2、可变数组

    #import "NSMutableArray+ArrayMCheck.h"
    #import <objc/runtime.h>
    
    @implementation NSMutableArray (ArrayMCheck)
    
    + (void)load{
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndex:));
            Method toMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndexCheck:));
            method_exchangeImplementations(fromMethod, toMethod);
        });
    }
    
    
    - (id)objectAtIndexCheck:(NSUInteger)index {
        if (self.count-1 < index) {
            // 异常处理
            @try {
                return [self objectAtIndexCheck:index];
            }
            @catch (NSException *exception) {
                // 打印崩溃信息
                NSLog(@"---------- %s Crash Because Method %s  ----------
    ", class_getName(self.class), __func__);
                NSLog(@"可变数组异常%@", [exception callStackSymbols]);
                return nil;
            }
            @finally {}
        } else {
            return [self objectAtIndexCheck:index];
        }
    }
    @end
    

     参考链接:http://www.jianshu.com/p/ff19c04b34d0

  • 相关阅读:
    谈谈我的经历--【产品设计中遇到的坑0】系列文章的序
    2017.02.04,读书,2017第二本《把时间当作朋友》读书笔记
    读书《重生,七年就是一辈子》
    好剧推荐:This is us
    直播预告:产品设计中不得不知的事情
    高德地图事件与插件绑定
    高德地图基础
    es6 Iterator和for...of循环
    class与class的继承
    JS保留两位小数的几种方法
  • 原文地址:https://www.cnblogs.com/superbobo/p/6419223.html
Copyright © 2011-2022 走看看