交换方法
2018-09-08 本文已影响1人
frankisbaby
利用runtime可以修改系统的方法实现,这种方式无任何侵入性,因此也是很多第三方常用的技术。它的解决具有全局性;
实现步骤:
1.给系统的方法添加分类;
2.自己实现一个带有扩展功能的方法;
3.交换方法 ,只需要交换一次
事例:
需求:有一个项目,已经开发了两年,忽然项目负责人添加一个功能,每次UIImage加载图片,告诉我是否成功;
对于这种需求怎么解决呢?我们想到的可能是通过继承的方式,
解决方案1:对imageNamed进行二次封装,然后以后加载图片就调用这个方法;但是这种方法对于组件化项目却不可能这么干,因为组件化之后你不可能挨个去更改各个组件;
解决方案2:利用runtime进行彻底的方法交换;
代码实现:

交换前的图解:

交换后的图解:

知识点:
+ (void)load;
+ (void)load {
}
把类加载进内存的时候调用,只会调用一次;
+ (void)initialize ;
+ (void)initialize {
static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{
//这里写方法交换的代码
});
}
这个方法会调用多次,使用的话需要加入oncetoken来进行锁定;