参考链接:
1、iOS黑魔法
Method Swizzling本质上就是对IMP和SEL进行交换。
那就回顾一下method的结构体构成。
runtime.h /// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型
typedef struct objc_method *Method;
struct objc_method {
SEL method_name OBJC2_UNAVAILABLE;
char *method_types OBJC2_UNAVAILABLE;
IMP method_imp OBJC2_UNAVAILABLE;
}
实现的核心API是
void method_exchangeImplementations(Method m1, Method m2)
核心实现
+(void)load{
[super load];
static dispatch_once_t onceToken;
dispatch_once(&onceToken , ^{
NSLog(@" load NSArray 生效");
Method fromMethod =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndex:)); Method toMethod =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(HH_objectAtIndex:));
//别弄错了,不是它object_getClass(@"__NSArrayI") method_exchangeImplementations(fromMethod, toMethod);
});
}
- (id)HH_objectAtIndex:(NSInteger )index{
if (index < self.count) {
return [self HH_objectAtIndex:index];
//交互问之后调用HH_objectAtIndex:就是调用系统的 objectAtIndex: !!!
}else{
NSLog(@" 你的 NSArray数组已经越界了 已经帮你处理好了 objectAtIndex = %ld count = %ld", index, self.count);
return nil;
}
类簇真身
NSArray 【__NSArrayI】
NSMutableArray 【__NSArrayM】
网友评论