在上一篇文章的基础上,我们实现对方法的交换,我们把方法交换放在load方法中.首先说下为什么要进行方法交换,其原因为当系统自带的方法功能不够,而我们想给系统自带的方法扩展一些功能.并且保留原有的功能时,需要进行方法交换.当然我们也可以继承自系统的类,重写系统方法进行方法覆盖达到方法交换的目的,当然我们也可以用runtime实现方法交换
实际的使用场景举例:1、在数组中,越界访问程序会崩,可以用自己的方法添加判断防止程序出现崩溃数组或字典中不能添加nil,如果添加程序会崩,用自己的方法替换系统防止系统崩溃;2、当我们的网络链接URL中出现汉字时,链接是无效的,但是这么明显的错误,编译器不会给我们指出来,但是不留心你可能又找不到,为了防止出现这种低级错误,我们也可以进行方法交换.
load是很特殊的一个方法,其会先于这个类执行的方法,该方法在类或者分类第一次加载内存的时候自动调用,一个load方法,很多个类都会执行,也就是说会执行多次,然而+load方法只在加载的时候执行一次.
首先我们在实现文件中添加一个change方法
-(void)change{
NSLog(@"交换方法的实现");
}
然后在+(void)load中实现对方法的交换
+(void)load{
Method method1 = class_getInstanceMethod(self.class, @selector(eat));
Method method2 = class_getInstanceMethod(self.class, @selector(change));
//进行交换
method_exchangeImplementations(method1, method2);
}
当完成以上操作的时候,在控制器中调用run方法时其实是调用的change方法,反之亦然.
Runtime方法交换就讲到这里