此黑魔法本應屬於OC,它是基於Runtime實現的偷天換日大法。
那麼什麼是Method Swizzling呢?從字面意思來看叫方法協調,大概就是這個意思了。使用此魔法可以替換現有方法為自定義方法,來個偷天換日,偷梁換柱。
使用方法很簡單,代碼基本為以下框架。但其具有較強的魔力,這是一個方法hook啊。
/** * Method Swizzling * 黑魔法之偷天換日 */ #import "UIViewController+Extension.h" #import@implementation UIViewController (Extension) // 為了保證一定執行 把代碼放到+ (void)load;裡 + (void)load { [super load]; // 線程安全 只執行一次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 獲取class Class class = [self class]; // Class class = object_getClass((id)self); // 封裝selector SEL originalSelector = @selector(viewWillAppear:); SEL swizzledSelector = @selector(lw_viewWillAppear:); // 封裝方法 Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); // 添加方法 BOOL methodDidAdd = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if(methodDidAdd) { // 替換方法 class_replaceMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); }else { // 交換方法 method_exchangeImplementations(originalMethod, swizzledMethod); } }); } #pragma mark - 自定義的魔法方法 - (void)lw_viewWillAppear:(BOOL)animated { [self lw_viewWillAppear:animated]; NSLog(@"BLack Magic"); }
注意:
1 + (void)load;
2 dispatch_once;
3 [self lw_viewWillAppear:animated]; // 不回死循環 若為[self viewWillAppear:animated];死循環