Swizzle黑魔法

参考链接:

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】

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,883评论 0 9
  • Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的...
    有一种再见叫青春阅读 3,775评论 0 3
  • 本文主要内容为用runtime实现Swizzle,即调换两个方法的实现 一点iOS runtime的基本知识 Ob...
    杰米阅读 5,462评论 2 7
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 6,614评论 0 7
  • Objective-C Category 可以随意重写本类的方法, Swift的Extension虽然易用, 但仍...
    南国青天阅读 4,592评论 0 0

友情链接更多精彩内容