用Runtime防止数组越界crash

利用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()可以出现在程序的任何一个位置。

另外.....

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 1.NSAssert NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递...
    字节码阅读 1,563评论 0 5
  • 本文结构 参考孟岩老师的文章,对本文结构如下划分 基本数据类型基本语法数组和其他集合类基本输入输出和文件处理,输入...
    不抄完整本三国不改名阅读 539评论 0 1
  • 张学良为什么在日本侵占东三省时候选择不抵抗?对于日本侵占东三省,东北军不予抵抗,世间广泛流传的是因为蒋介石下令让张...
    华子先森阅读 2,287评论 24 6
  • 最近生活平静了许多,近一个月也许发生了很多改变,从一个朝九晚五的上班一族,变成了整天在工地打转的无编制人员,从一...
    那年我19阅读 188评论 1 0