iOS runtime运行时特性解决数组越界问题。

 @interface NSObject (Exchange)

-(void)swizzleMethod:(SEL)OldSel withNewMethod:(SEL)NewSel;

 @end#import 

 "NSObject+Exchange.h"


@implementation NSObject (Exchange)

-(void)swizzleMethod:(SEL)OldSel withNewMethod:(SEL)NewSel

{

 Class selfclass=[self class]; 

Method oldMethod=class_getInstanceMethod(selfclass, OldSel);

 Method newMethod=class_getInstanceMethod(selfclass, NewSel); 

BOOL addselector=class_addMethod(selfclass, OldSel, class_getMethodImplementation(selfclass, NewSel), method_getTypeEncoding(newMethod));

 if (addselector) {

 NSLog(@"加方法成功"); 

class_replaceMethod(selfclass, NewSel, class_getMethodImplementation(selfclass, OldSel), method_getTypeEncoding(oldMethod)); 

}else { 

method_exchangeImplementations(oldMethod, newMethod); 

} }

 #import "NSObject+Exchange.h"

@interface NSArray (CheckIndex)

@end

#import "NSArray+CheckIndex.h"

@implementation NSArray (CheckIndex)

+(void)load{

 SEL oldSel=@selector(objectAtIndex:); 

SEL newSel=@selector(emptycheckObjectAtIndex:); 

SEL newSel1=@selector(arrayIcheckObjectAtIndex:); 

SEL newSel2=@selector(arrayMcheckObjectAtIndex:);

 [objc_getClass("__NSArray0") swizzleMethod:oldSel withNewMethod:newSel]; 

[objc_getClass("__NSArrayI") swizzleMethod:oldSel withNewMethod:newSel1];

 [objc_getClass("__NSArrayM") swizzleMethod:oldSel withNewMethod:newSel2];

[objc_getClass("__NSSingleObjectArrayI") swizzleMethod:@selector(objectAtIndex:) swizzledSelector:@selector(singleObjectIndex:)];



 }

-(id)emptycheckObjectAtIndex:(NSInteger)index{ 

if (self.count>index) { 

return [self emptycheckObjectAtIndex:index]; }else{ return nil; 

}

}

-(id)arrayIcheckObjectAtIndex:(NSUInteger)index{

 NSLog(@"检查");

 if (self.count>index) { return [self arrayIcheckObjectAtIndex:index];

 }else{

 return nil;

 }}

-(id)arrayMcheckObjectAtIndex:(NSUInteger)index{ 

NSLog(@"检查"); if (self.count>index) { 

 return [self arrayMcheckObjectAtIndex:index]; 

 }else{ 

return nil; 

 }

 }


-(id)singleObjectIndex:(NSInteger )index

{

    if (index >= self.count || index < 0) {

        return nil;

    }

    return [self singleObjectIndex:index];


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值