runtime交换方法 每天学一点

我们在做开发的时候比如系统自带的方法功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能。
目前需求 :给imageNamed 方法提供功能,每次加载图片就判断下图片是否加载成功。
两种办法
方式一:继承UIImage.重写方法
方式二:使用runtime,交换方法

分类里不能调用super 分类木有父类

/*
+(UIImage*)imageNamed:(NSString *)name
{
    
}
 */

这个时候我们要再返回参数加kindof

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

下面介绍runtime方法交换

类别也走load 方法所以 我们在进行runtime交换方法的时候要在load方法里实现

+(void)load
{
    //获取方法实现
    //class_getMethodImplementation(<#__unsafe_unretained Class cls#>, <#SEL name#>)
    //获取对象方法
   // class_getInstanceMethod(, <#SEL name#>)
    //获取类方法
    //class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)
    //交换方法实现
    
    Method imageNameMetha=class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method imageNameSJmetha=class_getClassMethod([UIImage class], @selector(SJ_imageNamed:));

//exchange:交换  
    method_exchangeImplementations(imageNameMetha, imageNameSJmetha);
}

你可能感兴趣的:(runtime交换方法 每天学一点)