美文网首页iOS集合
用Runtime防止数组越界crash

用Runtime防止数组越界crash

作者: 330b92bcaf74 | 来源:发表于2017-07-21 14:02 被阅读0次

    利用runtime可以实现交换系统方法这一强大功能,下面将利用这一功能实现即使数组越界也不会crash这一功能。

    #import "NSMutableArray+RZ.h"
    #import <objc/runtime.h>
    
    
    @implementation NSMutableArray (RZ)
    
    + (void)load {
     
        //系统方法
        Method sysMethod = class_getInstanceMethod(NSClassFromString(@"__NSArrayM"), @selector(objectAtIndex:));
        //自定义方法
        Method safeMethod = class_getInstanceMethod(NSClassFromString(@"__NSArrayM"), @selector(safeObjectAtIndex:));
    
        //交换
        method_exchangeImplementations(sysMethod, safeMethod);
    
    }
    
    
    - (id)safeObjectAtIndex:(NSInteger)index {
        
        if (index > (self.count - 1)) {
    //        NSAssert(NO, @"beyond the bound");
            return nil;
        }else if([self safeObjectAtIndex:index] == nil){
    //        NSAssert(NO, @"beyond bounds for empty array");
            return nil;
        }else{
            return [self safeObjectAtIndex:index];
        }
        
    }
    

    NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异常描述。NSAssert()是这样定义的:

    define NSAssert(condition, desc)

    condition是条件表达式,值为YES或NO;desc为异常描述,通常为NSString。当conditon为YES时程序继续运行,为NO时,则抛出带有desc描述的异常信息。NSAssert()可以出现在程序的任何一个位置。

    另外.....

    我的愿望是.......

    世界和平.........

    相关文章

      网友评论

        本文标题:用Runtime防止数组越界crash

        本文链接:https://www.haomeiwen.com/subject/igaskxtx.html