天天看点

OC语言--分类(category)

一、分类-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正在跳高
}