使用RunTime添加动态方法、方法交换、获取所有属性来重写归档解档

复制代码
#import "JZGMMMMModel.h"
#import <objc/message.h>
@implementation JZGMMMMModel
//**动态添加方法
void addmethod(id self, SEL _cmd)
{
    NSLog(@"addmethod");
}
+(BOOL)resolveInstanceMethod:(SEL)sel
{
    class_addMethod([self class], @selector(addmethod), (IMP)addmethod, "v@:");
    return [super resolveInstanceMethod:sel];
}



 +(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]];
}

连接 :http://www.jianshu.com/p/ab966e8a82e2
复制代码

 

posted @   超神船长  阅读(170)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示