我们在做开发的时候比如系统自带的方法功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能。
目前需求 :给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);
}