美文网首页
ios利用runTime进行方法交换-Method Swizzl

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

作者: 男人宫 | 来源:发表于2020-03-21 21:48 被阅读0次
  • 利用oc运行时特性,进行方法交换,一般是把一些类方法交换成我们自己的方法,或者修改一些SDK的一些方法等.
    methodSwizzling方法封装.创建一个NSObject类别,吧方法封装一下.,以后直接拿来用就可以了
#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
  • 做一个小用法举例说明
    比如你在用button的setBackgroundColor:方法设置颜色时,你想同时把button的title设置了.那么你就可以用自己的方法swizz_setBackgroundColor:去交换系统的setBackgroundColor:方法.具体使用时创建一个button的类别,在+(void)load方法中去进行方法交换.

#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

相关文章

网友评论

      本文标题:ios利用runTime进行方法交换-Method Swizzl

      本文链接:https://www.haomeiwen.com/subject/uifpyhtx.html