iOS執行時的用途一 -- 交換方法
阿新 • • 發佈:2019-02-16
前言
執行時的的交換方法也叫黑魔法,在許多的第三方框架都使用了,例如AFN等
步驟
一、獲得兩個需要交換的方法
Method aMethod = class_getClassMethod(self, aSel);
Method bMethod = class_getClassMethod(self, bSel);
二、交換兩個方法的實現方式
method_exchangeImplementations(aMethod, bMethod);
例子
場景:UI給的字號與實際有個等比例的關係,於是為了偷懶,我搞了一個交換方法
,給UIFont新增一個分類,並在+load方法裡進行交換。為了日後交換方便,我也給NSObject寫了一個分類
NSObject分類
@implementation NSObject (Exchange)
+(void)exchangeClassSelector:(SEL)aSel toSelector:(SEL)bSel
{
Method aMethod = class_getClassMethod(self, aSel);
Method bMethod = class_getClassMethod(self, bSel);
method_exchangeImplementations(aMethod, bMethod);
}
UIFont分類:
+(void )load
{
[self exchangeClassSelector:@selector(systemFontOfSize:) toSelector:@selector(fk_systemFontOfSize:)];
}
+ (UIFont *)fk_systemFontOfSize:(CGFloat)fontSize
{
//這裡要注意,返回的是“fk_systemFontOfSize:”,因為前面已經交換方法了,所以這裡實際呼叫的是系統的方法
return [self fk_systemFontOfSize:fontSize*11./20];
}