• 防止数组越界处理


    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

  • 相关阅读:
    Ubuntu14.04安装CMake3.5.1(转)
    树莓派进阶之路 (005)
    树莓派进阶之路 (004)
    树莓派进阶之路 (006)
    树莓派进阶之路 (007)
    树莓派 添加国内源
    树莓派进阶之路 (001)
    安装samba脚本
    Linux中tty、pty、pts的概念区别
    单片机串口通信原理及原理图
  • 原文地址:https://www.cnblogs.com/superbobo/p/6419223.html
Copyright © 2020-2023  润新知