ios利用runTime进行方法交换-Method Swizzl

2020-03-21  本文已影响0人  男人宫
#import "NSObject+Swizzing.h"
#import <objc/runtime.h>
@implementation NSObject (Swizzing)
+ (void)methodSwizzlingWithOriginalSelector:(SEL)originalSelector bySwizzledSelector:(SEL)swizzledSelector{
    Class class = [self class];
    //原有方法
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    //替换原有方法的新方法
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    //先尝试給源SEL添加IMP,这里是为了避免源SEL没有实现IMP的情况
    BOOL didAddMethod = class_addMethod(class,originalSelector,
                                        method_getImplementation(swizzledMethod),
                                        method_getTypeEncoding(swizzledMethod));
    if (didAddMethod) {//添加成功:说明源SEL没有实现IMP,将源SEL的IMP替换到交换SEL的IMP
        class_replaceMethod(class,swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {//添加失败:说明源SEL已经有IMP,直接将两个SEL的IMP交换即可
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
@end

#import "UIButton+Change.h"
#import "NSObject+Swizzing.h"

@implementation UIButton (Change)
+ (void)load
{
    static dispatch_once_t oneToken;
    dispatch_once(&oneToken, ^{
        
        [self methodSwizzlingWithOriginalSelector:@selector(setBackgroundColor:) bySwizzledSelector:@selector(swizz_setBackgroundColor:)];
        
    });
}
- (void)swizz_setBackgroundColor:(UIColor *)backgroundColor
{
    NSLog(@"交换了");
    //相当于调了原方法(其实已经交换过来了)
    [self swizz_setBackgroundColor:backgroundColor];
    [self setTitle:@"点我" forState:UIControlStateNormal];
}
@end
上一篇下一篇

猜你喜欢

热点阅读