runtime(二):黑魔法之让人毫无知觉的修改类方法
如果我们想重写一个类的方法的时候,我们会考虑到用到哪些方法呢?
1.用分类:用分类主要的缺点是,分类是没有父类的,不能调用父类的方法。而且需要引入头文件,容易被人发现。
2.用继承:继承虽然虽然能实现重写父类的方法,但是动作太大,容易被人发现。
3.runtime:方法交换!虽然用到了分类,但是!不需要引入头文件!!
废话不多说,直接上代码
1.给UIColor写一个分类,并引入#import <objc/message.h>
#import <UIKit/UIKit.h> @interface UIColor (extension) + (UIColor*)my_redColor; @end
#import "UIColor+extension.h" #import <objc/message.h> @implementation UIColor (extension) //这个方法会在加载这个分类的时候就调用 + (void)load{ Method redMethod = class_getClassMethod([UIColor class], @selector(redColor)); Method myredMethod = class_getClassMethod([UIColor class], @selector(my_redColor)); method_exchangeImplementations(redMethod, myredMethod); } + (UIColor *)my_redColor{ NSLog(@"111111"); //1.直接修改改方法 return [UIColor grayColor]; //2.调用以前方法,需要注意的是,这个时候[UIColor my_redColor]其实执行的是:redColor 这个方法。这个时候如果用 [UIColor redColor] 会导致死循环。 // return [UIColor redColor]; } @end
2.无需任何引入等操作,只要在任何类里面调用[UIColor redColor],就会实现方法交换。
例如:控制器里 self.view.backgroundColor = [UIColor redColor];