美文网首页
iOS OC使用runtime交换方法

iOS OC使用runtime交换方法

作者: 玉思盈蝶 | 来源:发表于2020-11-23 16:59 被阅读0次

    新建一个category;

    .h文件:

    //
    //  UIView+UIView_blackView.h
    //  OCApp
    //
    //  Created by 彭思 on 2020/11/23.
    //
    
    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UIView (UIView_blackView)
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    .m文件

    //
    //  UIView+UIView_blackView.m
    //  OCApp
    //
    //  Created by 彭思 on 2020/11/23.
    //
    
    #import "UIView+UIView_blackView.h"
    #import <objc/runtime.h>
    
    @implementation UIView (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
    
    

    使用如下:

    UIView *bgView = [[UIView alloc]init];
    bgView.frame = CGRectMake(100, 100, 100, 50);
    [bgView setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:bgView];
    

    最后view显示的orangeColor颜色。

    参考链接:

    https://www.jianshu.com/p/809b17f2b4a0

    https://www.jianshu.com/p/6bcff1f9feee

    相关文章

      网友评论

          本文标题:iOS OC使用runtime交换方法

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