美文网首页
Swizzle黑魔法

Swizzle黑魔法

作者: 涵啸虎 | 来源:发表于2019-03-22 16:21 被阅读0次

参考链接:

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】

相关文章

网友评论

      本文标题:Swizzle黑魔法

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