1. 程式人生 > >iOS執行時的用途一 -- 交換方法

iOS執行時的用途一 -- 交換方法

前言

執行時的的交換方法也叫黑魔法,在許多的第三方框架都使用了,例如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]; }