前言
Objective-C语言里的分类,也有人称为类别,也有人称为类目,到底是什么东西?
在国外,只有一种叫法:category
一、category是个什么东西?
有这么一种情况,我写个类,这个类里面,可能会有很多的成员,也就是很多的方法,例如,写1个学生类,类中有很多个方法,比如,有以下这么多方法:
1)吃
2)喝
3)拉
4)撒
5)睡
6)学习
7)敲代码
8)写书
9)玩儿游戏:Dota、LOL、CF
10)爬山
11)跑步
12)游泳
13)踢足球
14)打篮球
二、如果将这些方法都写在同1个类模块中,1个模块就是指1个.h文件和1个.m文件。当然完全是可以的,但是如果全都写在1个模块当中,就会显得很臃肿。不好管理,后面维护的时候,不好维护。
1.默认情况下,1个类独占1个模块,这个时候,将所有的成员都写在这1个模块当中,就很难管理,我们的想法:那么我们能不能让1个类占多个模块呢,将功能相似的方法定义在同一个模块里面,这样的好处:方便维护和管理
2.如何将1个类分成多个模块,分类就隆重登场了
3、分类,顾名思义:把类分开,将1个类分成多个模块
4、如何把1个类分成多个模块呢:如何为1个类添加分类,你要来个分类,首先要有1个本类,我们来给Student类添加1个分类,让Student类占两个模块,点一下Target,右键,点1下New File ,选择Objective-C File ,点击Next,文件的类型,File Type选择Category,然后为这个分类取个名字吧,例如test,你这个分类是要把哪个类分开,Student类,那就在Class里面写上Student,点击Next,点击Create
5、这时候,又出来1个模块,也就是又出现1个.h文件和1个.m文件,有几个特点:a 这个模块的文件名是:本类名 + 分类名.h,本类名 + 分类名.m
6、添加的分类也分为声明和实现,声明的语法:
@interface 本类名 (分类名)
@end
后面加个小括号,代表什么意思,代表并不是要创建1个Student类,而是为这个已经存在的Student类,添加1个分类。这个分类的名字叫什么呢,叫test,为什么要为分类取个名字呢,因为我们说过,1个类是不可以分成多个模块啊,也就是说,我可以为这个Student类添加2个分类,添加3个分类,添加4个分类,为了区分每1个分类呢,所以每1个分类要取个名字。
7、@interface 本类名 (分类名)代表不是新创建1个类,而是对已有的类添加1个分类,小括弧中写上这个分类的名字,因为1个类可以添加多个分类,为了区分每1个分类,所以分类要取名字。这是分类的声明
8、分类的实现:@implementation Student (test)这是实现的谁呢,实现Student分类的test分类,并不是去实现Student类
9、怎么去理解这两个模块:Student.h和Student.m,Student+test.h和Student+test.m,类,有几个,Student类只有1个,只不过这个Student类,它屁股大,占了几个模块,占了2个模块,这个时候我不管是在Student里面写东西,还是在Student+test这个分类里面写东西,其实都是谁的,都是Student类的。
三、分类的使用:
1、例如,有下面这样1个Student类:
#import
@interface Student : NSObject
– (void)haha;
@end
#import “Student.h”
@implementation Student
– (void)haha
{
NSLog(@“哈哈。。。”);
}
@end
2、还有下面这样1个分类:Student+test
#import “Student.h”
@interface Student (test)
– (void)hehe;
@end
#import “Student+test.h”
@implementation Student (test)
– (void)hehe
{
NSLog(@“呵呵。。。”);
}
@end
3、在main.m文件中:
#import
#import “Student.h”
#imporlt “Student+test.h”
int main(int argc, const char * argv[])
{
Student *s1 = [Student new];
[s1 haha];
[s1 hehe];//如果你要访问分类的成员,那么就要把这个分类的头文件引进来:Student+test.h
return 0;
}
4、如果要访问分类中定义的成员,就要把分类的头文件引进来
5、再来个分类:@interface Student (suiBian)
@interface Student (suiBian)
– (void)taiSuiBian;
@end
@implementation Student (suiBian)
– (void)taiSuiBian
{
NSLog(@“嘿嘿。。。”);
}
@end
这时候,在main.m文件中,就要把这个分类的头文件引进来
#import
#import “Student.h”
#import “Student+test.h”
#import “Student+suiBian.h”
int main()
{
Student *s1 = [Student new];
[s1 haha];
[s1 hehe];
[s1 taiSuiBian];
}
6、到目前为止,你能体会到分类的作用是什么:就是将1个类分成多个模块