OC基础知识:分类Category
当我们需要为UIKit类/Foundation框架中提供的系统类增加新的API时,可以有多种方法实现,例如,我们可以新建一个子类,然后在子类中实现新的功能,但这样做会增加很多类,从而增加代码维护的工作量。除此之外,我们还可以对原有的类增加其分类,对类中提供的API进行扩展,例如,在原有的系统类中定义新的方法,这称为分类Category。
创建分类的方法
当我们需要对一个类新增一些新方法时,可以使用分类Category功能。特别是针对系统自定义的类,如UIView、UIImageView等都如此。例如,大名鼎鼎的SDWebImage框架,就是UIImageView类的分类。假如我们希望给UIImageView类增加一个分类,在该分类中新增一个类方法,即:当实例化一个UIImageView对象时,可以默认填充一张图片。我们可以按照如下步骤进行:
- 在Xcode中创建分类文件,如下所示,新增一个文件,选择Objective-C File:
- 填写分类的名称,File Type选择Category,Class填写是针对哪个类的扩展;
- 点击Next即可完成文件的添加,添加完成后,在工程目录中会出现,如下两个文件
- 在.h文件中,添加需要实现的新方法名称,即增加新的API
#import <UIKit/UIKit.h>
@interface UIImageView (DefaultImage)
+(UIImageView *) imageViewWithDefaultImage;
@end
- 在.m文件中,对新增的方法实现其具体的功能,例如,当调用UIImageView的imageViewWithDefaultImage方法时,会自动填充上一个默认占位图。
#import "UIImageView+DefaultImage.h"
@implementation UIImageView (DefaultImage)
+(UIImageView *) imageViewWithDefaultImage {
UIImage *image = [UIImage imageNamed:@"placeholder"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
return imageView;
}
@end
- 当需要创建UIImageView对象的时候,我们可以使用分类中新增的imageViewWithDefaultImage方法来创建一个UIImageView对象,并且该对象具有一个默认图片。
#import "ViewController.h"
#import "UIImageView+DefaultImage.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [UIImageView imageViewWithDefaultImage];
NSLog(@"%@",imageView.image);
}
@end
使用分类时的注意事项
当我们在使用分类Category时,有如下几个方法需要程序员关注。
不要用分类去重写已经存在的方法;
通过使用分类添加的方法,不仅针对该类有效,对于其子类也有效,例如:给UIView添加了分类,UIImageView、UIButton等子类也可以使用;
对象+分类必须名称唯一。