iOS小记--方法交换

2019-11-08  本文已影响0人  原鸣清

核心代码就是下面这些,照着弄到你自己的工程里就能用。原理上边的文章讲得很优秀了,速度去点个赞。这里介绍下使用时需要注意的点:


#import "LoadingToast+test.h"
#import <objc/runtime.h>


@implementation LoadingToast (test)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
//        Class class = [self class];
        // When swizzling a class method, use the following:
         Class class = object_getClass((id)self);
       
        SEL originalSelector = @selector(hideToastActivity);
        SEL swizzledSelector = @selector(track_hideToastActivity);
        
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
        
        BOOL didAddMethod =
        class_addMethod(class,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));
        
        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
    
}

+ (void)track_hideToastActivity {
    [self track_hideToastActivity];
    NSLog(@"track_hideToastActivity : %@",[NSThread callStackSymbols]);
}

@end
上一篇 下一篇

猜你喜欢

热点阅读