Runtime之方法交换

1.首先导入头文件<objc/message.h>
2.编写MyImageNamed:方法

// 运行时

// 先写一个其他方法,实现这个功能

// 在分类里面不能调用super,分类木有父类
//+ (UIImage *)imageNamed:(NSString *)name
//{
//    [super im]
//}

+ (UIImage *)MyImageNamed:(NSString *)imageName
{
    // 1.加载图片
    UIImage *image = [UIImage MyImageNamed:imageName];
    
    // 2.判断功能
    if (image == nil) {
        NSLog(@"加载image为空");
    }
    
    return image;
}

3.在使用之前调用交换方法,这里交换的两个方法分别是imageNamed: 和MyImageNamed:

    // 交换方法实现,方法都是定义在类里面
    // class_getMethodImplementation:获取方法实现
    // class_getInstanceMethod:获取对象
    // class_getClassMethod:获取类方法
    // IMP:方法实现
    
    // imageNamed
    // Class:获取哪个类方法
    // SEL:获取方法编号,根据SEL就能去对应的类找方法
    Method imageNameMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
    
    // MyImageNamed
    Method MyImageNamedMethod = class_getClassMethod([UIImage class], @selector(MyImageNamed:));
    
    // 交换方法实现
    method_exchangeImplementations(imageNameMethod, MyImageNamedMethod);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用场景 在我们使用系统的方法时,功能有可能不够用,或者在想在调用系统的方法时,加一些判断。当然我可以继承系统的类...
    coderBing阅读 2,163评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,762评论 0 9
  • 最近听了蛮多 runtime 平时完全用不到的这种言论,所以慢慢的写一点 runtime 在项目中的应用场景。其中...
    NSPanda阅读 1,556评论 2 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 保持年轻的心态。 一般来说,往回退十年,说这句话的人,很容易就泄露了自己的年龄。 脑海里浮现的是一位胡须发白精神爽...
    Firewinter阅读 319评论 0 0