你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS黑魔法之Method Swizzling

iOS黑魔法之Method Swizzling

編輯:IOS開發綜合

此黑魔法本應屬於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];死循環

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved