ios - runtime运行时应用---交换方法

  • runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor
  • 首先创建UIView的分类
  • 在分类中导入头文件#import <objc/runtime.h>
  • 实现load类方法 --- 类被加载运行的时候就会调用
  • 分别获取系统setBackgroundColor方法 和自定义的 pb_setBackgroundColor 方法.然后交换
  • 在AFNetworking中也有应用,AFN中利用runtime将访问网络的方法做了替换,替换后可以监听网络连接状态
static inline void af_swizzleSelector(Class theClass, SEL originalSelector, SEL swizzledSelector) {
     Method originalMethod = class_getInstanceMethod(theClass, originalSelector);
     Method swizzledMethod = class_getInstanceMethod(theClass, swizzledSelector);
     method_exchangeImplementations(originalMethod, swizzledMethod);


#import "UIView+BlackView.h"

/** 导入头文件 */
#import <objc/runtime.h>


@implementation UIView (BlackView)



+(void)load{

    /** 获取原始setBackgroundColor方法 */
    Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));
    
    /** 获取自定义的pb_setBackgroundColor方法 */
    Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));
    
    /** 交换方法 */
    method_exchangeImplementations(originalM, exchangeM);
}

/** 自定义的方法 */
-(void)pb_setBackgroundColor:(UIColor *) color{

    NSLog(@"%s",__FUNCTION__);
    
    /** 
     1.更改颜色
     2.所有继承自UIView的控件,设置背景色都会设置成自定义的'orangeColor'
     3. 此时调用的方法 'pb_setBackgroundColor' 相当于调用系统的 'setBackgroundColor' 方法,原因是在load方法中进行了方法交换.
     4. 注意:此处并没有递归操作.
     */
    [self pb_setBackgroundColor:[UIColor orangeColor]];
}

@end


  • 控制器中测试
  • 分别创建一个Button 以及一个 View 并且设置好颜色,看效果

- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton * btn = [UIButton new];
    btn.backgroundColor = [UIColor blackColor];
    [self.view addSubview:btn];
    btn.frame = CGRectMake(0, 30, 200, 40);
    [btn setTitle:@"点击" forState:UIControlStateNormal];
    
    UIView * viw = [[UIView alloc] initWithFrame:CGRectMake(0, 100, 100, 100)];
    viw.backgroundColor = [UIColor blueColor];
    [self.view addSubview:viw];
    

}


  • 效果如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundC...
    皮皮瑞阅读 757评论 0 0
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,205评论 30 471
  • 原本自己写了一些简单的使用方法,但是发现没别人写的好,也没精力写,就直接把以前写的直接删了,引用了别人的,自己没事...
    XieHenry阅读 299评论 0 2
  • 这篇文章本是前天就该写的,因为是7月31号~8月1号那个夜晚的梦境,但由于个人原因,今夜才开始码字。 那天早晨醒来...
    SSSSSpunk阅读 240评论 0 0
  • 新课优惠上线通知:【美华老师的禅绕画-就是爱禅绕】订阅新课上线啦!!一支笔、一张纸、无需橡皮擦轻松学禅绕。18堂视...
    禪心園文創設計工作室阅读 1,951评论 0 11