Category可以动态的为已经存在的类添加新的行为,但不能添加成员变量。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
假设有一个Student类,现在需要在不修改原始类、不增加子类的情况下,给Student类添加一个test方法,只需要创建Student+Test.h和Student+Test.m文件,在声明文件和实现文件中用“()”把Category的名称括起来即可。
原始类Student:
//Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject
@end
//Student.m
#import "Student.h"
@implementation Student
@end
//Student+Test.h
#import "Student.h"
@interface Student (Test)
- (void)test;
@end
//Student+Test.m
#import "Student+Test.h"
@implementation Student (Test)
- (void)test {
NSLog(@"I am a good student");
}
@end
Category的使用:
//main.m
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Student+Test.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [[[Student alloc] init] autorelease];
[stu test];
}
return 0;
}
Category的使用场景:
(1)需求变更,需要为类添加新的方法;
(2)把类的方法按功能等进行分类,或者类的方法需要不同的开发成员实现;
(3)在使用基础类库中的类时,实现自定义的一些方法。