zoukankan      html  css  js  c++  java
  • 使用运行时函数实现方法交换

    通过objc/runtime.h函数库,可以做一些比较有趣的修改,比如平常在使用[UIImage imageNamed:]方法时,即便图片字符串名称填写错误,程序编译或运行时系统都不会提示出错。此处给原方法添加一个小改动,当image为nil时,使用NSLog打印输出台的方式提醒“加载失败”

    • 解决方法一:创建UIIimage的子类,重写[UIImage imageNamed:]方法
      缺点:所有的加载图片都必须要使用自己的类,而且如果是在旧版本上进行迭代,要是修改地方比较多的话会很蛋疼

    • 解决方法二:使用分类为UIIimage类添加一个新方法
      缺点:每次加载图片时,都需要导入分类,而且需要系统方法会被干掉,需要自己实现方法(分类中无法调用super)

    • 解决方法三:使用<objc/runtime.h>中的method_exchangeImplementations实现两个方法之间的交互实现
    #import "UIImage+myImageNamed.h"
    #import <objc/runtime.h>
    @implementation UIImage (myImageNamed)
    +(void)load
    {
        //获取自带方法
        Method imageNamed = class_getClassMethod(self, @selector(imageNamed:));
        //获取分类添加的方法
        Method myImageNamed = class_getClassMethod(self, @selector(myImageNamed:));
        //交换实现
        method_exchangeImplementations(myImageNamed, imageNamed);
        [super load];
    }
    
    +(UIImage *)myImageNamed:(NSString *)name
    {
        //1.加载图片
        UIImage *image = [UIImage myImageNamed:name];
        if (image == nil) {
            NSLog(@"加载失败");
        }
        return image;
    }
    @end
    

    好处:无须在原项目文件在import分类,也无须修改原方法名,即在不对原代码进行任何修改的基础,仅需添加分类方法即可实现原系统方法的改进

  • 相关阅读:
    读取XML直接转换为类对象
    EF 连接sql2000
    Web自动化测试 七 ----- 鼠标、键盘操作
    Web自动化测试 六 ----- selector选择
    Web自动化测试 五 ----- selenium的等待和切换
    Web自动化测试 四 ----- python selenium 八大元素定位
    Web自动化测试 三 ----- DOM对象和元素查找
    Web自动化测试 二 ----- HTML
    Web自动化测试 一
    HTTP和HTTPS的区别
  • 原文地址:https://www.cnblogs.com/ShaRuru/p/5090394.html
Copyright © 2011-2022 走看看