免费开源的iOS开发学习平台

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等子类也可以使用;

  • 对象+分类必须名称唯一。

示例代码

https://github.com/99ios/5.2