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

  • 相关阅读:
    阿狸的打字机(bzoj 2434)
    Censoring(bzoj 3940)
    文本生成器(bzoj 1030)
    病毒(bzoj 2938)
    Road(bzoj 2750)
    codevs 2370 小机房的树
    HDU 2838 Cow Sorting
    luogu P2253 好一个一中腰鼓!
    hdu 1166 敌兵布阵
    luogu P1901 发射站
  • 原文地址:https://www.cnblogs.com/superbobo/p/6419223.html
Copyright © 2011-2022 走看看