Category可以在不需要创建子类或是修改原始类的基础上,动态为已经存在的类添加新的行为(方法),,这样可以保证类的原始设计规模较小,功能增加时再逐步扩展;实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。Category只能扩展方法,不能增加成员变量。方便团队合作时进行模块化开发。
使用场景:
- 在定义类时的某些情况下(例如需求变更),你可能想要为其中某个或几个类添加新的方法;
- 一个类中包含了许多不同种类的方法需要实现,而这些方法需要不同的团队成员去实现;
- 在使用某些基础类库时,有可能希望实现一些自己需要的方法,比如写个NSString+JSON.h,为NSString这个类拓展一些解析JSON的方法;
//Catelogy的定义: //定义NSString+JSON.h头文件 #import <Foundation/Foundation.h> @interface NSString (JSON) + (NSString *)json; @end //定义NSString+JSON.m实现文件 #import "NSString+JSON.h" @implementation NSString (JSON) + (NSString *)json { return @"{'id':10, 'name':'lyf'}"; } @end //使用Catelogy: #import "NSString+JSON.h"
//一定要先引用其头文件,如果是对自定义类的方法进行扩展,这里还需引用原始类的头文件
int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"%@", [NSString json]); } return 0; }
使用注意:
- Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑继承创建子类;
- Category可以重载原始类的方法,但不推荐这么做,因为这样会覆盖原来的方法,导致无法访问原来的方法。如果需要实现重载,建议创建子类。