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

  • 相关阅读:
    vue-awesome-swiper-T 轮播图
    transition-T 手机端滑动验证
    VUE-T
    跨域配置-Access-Control-Allow-Origin
    HTML中CSS引入图片并铺满背景
    mysql_affected_rows()、mysql_fetch_row、mysql_fetch_assoc
    tp框架的四种路由方式
    sql注入
    禁用cookie,怎么获得session
    git解决冲突的方法
  • 原文地址:https://www.cnblogs.com/superbobo/p/6419223.html
Copyright © 2011-2022 走看看