1.交换方法(在分类的load方法中交换方法)
-
1.开发使用场景:系统自带的方法功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能。
方式一:继承系统的类,重写方法.
方式二:使用runtime,交换方法.
注意: 分类中添加属性,一般是给类增加set方法和get方法,而不是添加属性,除非是通过运行时的动态添加属性-
2.要交换方法的类
// 控制器中
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// UIImage *image = [UIImage imageNamed:@"123"];
// 1.每次使用,都需要导入头文件
// 2.当一个项目开发太久,使用这个方式不靠谱
[UIImage imageNamed:@"123"];
// imageNamed:
// 实现方法:底层调用xmg_imageNamed
// 本质:交换两个方法的实现imageNamed和xmg_imageNamed方法
// 调用imageNamed其实就是调用xmg_imageNamed
// imageNamed加载图片,并不知道图片是否加载成功
// 以后调用imageNamed的时候,就知道图片是否加载
}
-
3.要交换方法的类的分类
#import "UIImage+Image.h"
#import <objc/message.h>
// 控制器的分类中.m,.h无需写任何东西
@implementation UIImage (Image)
// 加载这个分类的时候调用
+ (void)load
{
// 交换方法实现,方法都是定义在类里面
// class_getMethodImplementation:获取方法实现
// class_getInstanceMethod:获取对象
// class_getClassMethod:获取类方法
// IMP:方法实现
// imageNamed
// Class:获取哪个类方法
// SEL:获取方法编号,根据SEL就能去对应的类找方法
Method imageNameMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
// xmg_imageNamed
Method xmg_imageNamedMethod = class_getClassMethod([UIImage class], @selector(xmg_imageNamed:));
// 交换方法实现
method_exchangeImplementations(imageNameMethod, xmg_imageNamedMethod);
}
// 运行时
// 先写一个其他方法,实现这个功能
// 在分类里面不能调用super,分类木有父类
//+ (UIImage *)imageNamed:(NSString *)name
//{
// [super im]
//}
+ (UIImage *)xmg_imageNamed:(NSString *)imageName
{
// 1.加载图片
UIImage *image = [UIImage xmg_imageNamed:imageName];
// 2.判断功能
if (image == nil) {
NSLog(@"加载image为空");
}
return image;
}
@end