Runtime交换方法

利用Runtime 替换系统的方法,从而实现修改全局view的背景色。

####### 注:好多第三方的类库,都是导入头文件,不需要写其他的代码就可以完成一些设置,其实他的思路就是,重写load方法,然后利用Runtime 替换系统方法。下面是FDFullscreenPopGesture的load方法:
+ (void)load{
//线程保证下面的代码只会走一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
//定义系统的视图将要出现的方法名。
SEL originalSelector = @selector(viewWillAppear:);
//定义一个自定义的视图将要出现的方法名
SEL swizzledSelector = @selector(fd_viewWillAppear:);
//class_getInstanceMethod :class根据后面的方法名获取对象方法,class_getClassMethod:是根据方法名获取类方法

    Method originalMethod = class_getInstanceMethod(class, originalSelector);
//获取到的系统的视图将要出现的方法。
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
//自定义的视图将要出现的方法
    
    BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
//给类添加方法,方法名是:originalSelector,方法的实现:method_getImplementation(swizzledMethod)
    if (success) {
        class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
//如果添加成功就替换掉系统方法originalMethod的实现函数
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
//失败就交换两个方法的实现。
    }
});
//其实主要目的就是替换掉原始方法:originalMethod的实现函数。
1,新建UIView的分类,首先导入类库,在load方法里直接替换UIview 的系统设置背景色的方法,替换为自己的方法。
+(void)load{

//    class_getInstanceMethod  获取对象方法

//    class_getMethodImplementation 获取方法的实现

//    class_getClassMethod 获取类方法

Method  bgMethod = class_getInstanceMethod([UIView class],   @selector(setBackgroundColor:));

Method zdq_bgMethod = class_getInstanceMethod([UIView class], @selector(zdq_backgroundColor:));

//交换方法

method_exchangeImplementations(bgMethod, zdq_bgMethod);

}

2,自己定义设置背景色的方法。(这里颜色是写死的)
-(void)zdq_backgroundColor:(UIColor *)color{
//这里如果调用系统的setBackgroundColor方法,才会真正实现循环调用
[self zdq_backgroundColor:[UIColor whiteColor]];

}

你可能感兴趣的:(Runtime交换方法)