• runtime(二):黑魔法之让人毫无知觉的修改类方法


    如果我们想重写一个类的方法的时候,我们会考虑到用到哪些方法呢?

    1.用分类:用分类主要的缺点是,分类是没有父类的,不能调用父类的方法。而且需要引入头文件,容易被人发现。

    2.用继承:继承虽然虽然能实现重写父类的方法,但是动作太大,容易被人发现。

    3.runtime:方法交换!虽然用到了分类,但是!不需要引入头文件!!

    废话不多说,直接上代码

    1.给UIColor写一个分类,并引入#import <objc/message.h>

    #import <UIKit/UIKit.h>
    @interface UIColor (extension)
    + (UIColor*)my_redColor;
    @end
    #import "UIColor+extension.h"
    #import <objc/message.h>
    
    @implementation UIColor (extension)
    //这个方法会在加载这个分类的时候就调用
    + (void)load{
        Method redMethod = class_getClassMethod([UIColor class], @selector(redColor));
        Method myredMethod = class_getClassMethod([UIColor class], @selector(my_redColor));
        method_exchangeImplementations(redMethod, myredMethod);
    }
    
    + (UIColor *)my_redColor{
        NSLog(@"111111");
        //1.直接修改改方法
        return [UIColor grayColor];
        
        //2.调用以前方法,需要注意的是,这个时候[UIColor my_redColor]其实执行的是:redColor 这个方法。这个时候如果用 [UIColor redColor] 会导致死循环。
    //    return [UIColor redColor];
    }
    @end

    2.无需任何引入等操作,只要在任何类里面调用[UIColor redColor],就会实现方法交换。

    例如:控制器里 self.view.backgroundColor = [UIColor redColor];

  • 相关阅读:
    Python自动截图html页面
    filebeat+kafka+logstash+Elasticsearch+Kibana日志收集系统搭建
    k8s重要概念
    1721. 使括号有效的最少添加
    167. 链表求和
    272. 爬楼梯 II
    1609. 链表的中间结点
    SQL server查看触发器是否被禁用
    C#窗体内控件大小随窗体等比例变化
    微信接口返回码参考表
  • 原文地址:https://www.cnblogs.com/fusheng-it/p/5640438.html
Copyright © 2020-2023  润新知