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

  • 相关阅读:
    STM32 端口复用配置
    stm32 新建文件记得添加到工程
    keil解决SYSTEMsysstm32f10x.h(298): error: #67: expected a "}"
    解决Keil复制中文乱码
    STM32 MPU6050 源码
    STM32 PWM输出
    STM32定时器
    STM32 看门狗操作姿势
    开课博客
    第二周学习进度
  • 原文地址:https://www.cnblogs.com/superbobo/p/6419223.html
Copyright © 2011-2022 走看看