# Objective-C之Category(分类)
#### 假设有这样一个场景,我们需要定义一个Person类,这个类包含很多方法,如:吃饭、喝水、打LOL、看书、敲代码、唱歌、跳舞、rap、游泳、爬山、玩Switch…………
#### 看起来是不是有点乱呢🤔,如果把这些方法都在一个类里实现,时间久了,会导致代码非常的“臃肿”,后期难以维护和管理。默认情况下,一个类独占一个模块,那我们是不是可以让一个类占多个模块,并按功能分类,将相似类目的方法放到一个模块中呢?答案是可以的,这时就需要本文的主角----**category**
#### 我们试着将上述的方法进行分类,如下:
>学习:看书、敲代码
>文娱:唱歌、跳舞、rap
>生存:吃饭、喝水
>运动:爬山、游泳
>游戏:打LOL、玩Switch
这样看起来是不是更清晰了呢😜,接下来步入主题👇
#### 如何创建一个分类
步骤一:

步骤二:

步骤三:

最终我们的分类就创建好啦

#### 代码
**学习分类**
CPerson+Study.h
```
@interface CPerson (Study)
- (void)code;
- (void)read;
@end
```
CPerson+Study.m
```
@implementation CPerson (Study)
- (void)code {
NSLog(@"敲代码");
}
- (void)read {
NSLog(@"读书");
}
@end
```
**生存分类**
CPerson+Live.h
```
@interface CPerson (Live)
- (void)eat;
- (void)drink;
@end
```
CPerson+Live.m
```
@implementation CPerson (Live)
- (void)eat {
NSLog(@"吃饭");
}
- (void)drink {
NSLog(@"喝水");
}
@end
```
**主函数**
```
int main(int argc, const char * argv[]) {
@autoreleasepool {
CPerson *ps = [[CPerson alloc] init];
// 生存相关方法
[ps eat];
// 学习相关方法
[ps code];
}
return 0;
}
```
**控制台打印**
```
2022-03-02 00:16:01.149302+0800 20220301_OC_category[2124:91649] 吃饭
2022-03-02 00:16:01.149491+0800 20220301_OC_category[2124:91649] 敲代码
```
#### 注意:
**1.分类中只能增加方法,不能增加属性,否则会编译报错。**
>
>
**2.分类中可以写@property,但是只会生成getter和setter的声明,不会生成getter和setter的实现。编译可通过,但调用会崩溃。**
>编译
>
>
>调用
>
>
**3.在分类的方法中不能直接访问本类的私有属性,但是可以用setter、getter方法访问。**
>本类
>
>
>分类中直接访问
>
>
>分类通过setter、getter访问
>
>
**4.当分类中有和本类重名的方法,优先调用分类的方法,即使没有引入分类的头文件。
如果多个分类中都有相同的方法,优先调用最后编译的方法**
>本类
>
>
>分类
>
>
>调用
>
>
>控制台打印
>
```
2022-03-02 00:57:31.792788+0800 20220301_OC_category[2751:130371] 我是分类
```
##### 总结
>Q:什么时候使用分类?
>A:当一个类中的方法多而杂时,就是用分类。