您的位置:首页 > 移动开发 > IOS开发

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

2017-08-29 22:06 246 查看
@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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: