一、分类-category
在实际开发中,一个项目包含多种多样的功能,每一个功能可以分成一个模块,这些模块都是属于一个类,但是完成的功能不同,所以在实际开发中,我们一般将庞大的项目工程分成模块,在每一个模块中完成一个功能,这样开发人员只需要负责自己的模块就可以了,不必要去管其他的模块功能。如果要求在不改变原来类的基础上扩充一些模块功能,该怎么办?这样就应用到了分类,分类可以再不改变原来类的基础上扩充项目的一些功能。
二、分类的功能:可以在不修改原来类的基础上给某一个类扩充一些方法。
三、分类的声明和实现:
//分类的声明 .h文件
@interface 原来类名(分类名称)
//...方法列表
@end
//分类的是实现 .m文件
@implementation 原来类名(分类名称)
//...方法的实现
//...
@end
示例:
//默认的文件名称:(Person+Study).h @interface Person(Study) - (void)read; @end //默认的文件名称:(Person+Study).m @implementation Person(Study) - (void)read { NSLog(@"我正在读书"); } @end
四、分类的使用注意:
1.分类只能增加方法,不能增加成员变量;
2.分类方法实现中可以访问原来类的成员变量;
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,这样导致原来类中的同名方法不能再使用;
4.方法调用优先级:分类(最后编译的分类优先)->原来类->父类
使用注意和说明示例:
//Person.h文件 @interface Person @property int age; //声明成员变量 @property int weight; - (void)run; //声明run方法 @end //Person.m文件 @implementation Person @synthesize age = _age; @synthesize weight = _weight; - (void)run //实现run方法 { NSLog(@"我在跑步"); } @end //Person+Study.h文件 @interface Person(Study) //Person的Study分类 //@property int no; //分类中不能声明成员变量 - (void)read; //声明read方法 - (void)run; //声明跟Person类中同名的run方法 - (void)jump; //声明jump方法 @end //Person+Study.m文件 @implementation Person(Study) - (void)read { NSLog(@"年龄为%d的人正在读书", _age); //分类中可以访问Person类的成员变量 } - (void)run { NSLog(@"Person+Study的类在跑步"); } - (void)jump { NSLog(@"Person+Study正在跳高"); } @end //Person+Sport.h文件 @interface Person(Sport) //Person类的Sport分类 - (void)jump; //声明与Study分类同名的jump方法 @end Person+Sport.m文件 @implementation Person(Sport) - (void)jump { NSLog(@"Person+Sport正在跳高"); } @end //main.m文件 int main() { Person *p = [[Person alloc] init]; //创建Person类的对象 p.age = 15; //成员变量赋值 p.weight = 40; [p run]; //调用Person+Study分类中的run方法,结果为:Person+Study的类在跑步 [p read]; //结果:年龄为15的人正在读书 [p jump]; //如果Person+Study比Person+Sport类后编译,结果为:Person+Study正在跳高 //否则为:Person+Sport正在跳高 }