runtime-方法交换-实例

需求:简单统一快速的给app里面所有的button修改字体颜色

#import "UIButton+NXButton.h"

@implementationUIButton (NXButton)

+ (void)load {

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        MethodcolorMethod =class_getInstanceMethod([selfclass],@selector(willMoveToSuperview:));

        MethodnewColorMethod =class_getInstanceMethod([selfclass],@selector(nx_willMoveToSuperview:));

        BOOLsuccess =class_addMethod([selfclass],@selector(willMoveToSuperview:),method_getImplementation(newColorMethod),method_getTypeEncoding(newColorMethod));

        if(success) {

      class_replaceMethod([selfclass],@selector(nx_willMoveToSuperview:),method_getImplementation(colorMethod),method_getTypeEncoding(colorMethod));

        }else{

            method_exchangeImplementations(colorMethod, newColorMethod);

        }

    });

}

- (void)nx_willMoveToSuperview:(UIView*)newSuperView {

    self.titleLabel.font = [UIFont systemFontOfSize:20];

    [self setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal];

}

@end

总结:

1.class_getInstanceMethod:得到类的实例方法

class_getClassMethod:得到类的类方法

2.class_addMethod:

OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp,

                                constchar*types)

    __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

cls 参数表示需要添加新方法的类;name 参数表示 selector 的方法名称(自己定义的方法);imp 即 implementation ,表示由编译器生成的、指向实现方法的指针。这个指针指向的方法就是我们新添加的方法;*types 表示我们要添加的方法的返回值和参数

你可能感兴趣的:(runtime-方法交换-实例)