0
点赞
收藏
分享

微信扫一扫

Objective-C之Category(分类)

扶摇_hyber 2022-03-11 阅读 122

# Objective-C之Category(分类)

#### 假设有这样一个场景,我们需要定义一个Person类,这个类包含很多方法,如:吃饭、喝水、打LOL、看书、敲代码、唱歌、跳舞、rap、游泳、爬山、玩Switch…………

#### 看起来是不是有点乱呢🤔,如果把这些方法都在一个类里实现,时间久了,会导致代码非常的“臃肿”,后期难以维护和管理。默认情况下,一个类独占一个模块,那我们是不是可以让一个类占多个模块,并按功能分类,将相似类目的方法放到一个模块中呢?答案是可以的,这时就需要本文的主角----**category**

#### 我们试着将上述的方法进行分类,如下:

>学习:看书、敲代码

>文娱:唱歌、跳舞、rap

>生存:吃饭、喝水

>运动:爬山、游泳

>游戏:打LOL、玩Switch

这样看起来是不是更清晰了呢😜,接下来步入主题👇

#### 如何创建一个分类

步骤一:

![cdb3323357c0fdb0e44a23e1c4e1ed4d.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p17)

步骤二:

![b0186321e4c37c409bc86df33378dc07.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p18)

步骤三:

![a104788c9642680a0c0498de2b12e291.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p19)

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

![5820f1101a3387dac9f848ddcf2f359d.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p20)

#### 代码

**学习分类**

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.分类中只能增加方法,不能增加属性,否则会编译报错。**

>![0ff4e90eacb2f2ec687f1eea6e23d1bf.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p21)

>

**2.分类中可以写@property,但是只会生成getter和setter的声明,不会生成getter和setter的实现。编译可通过,但调用会崩溃。**

>编译

>![8ecb49c92a13b138929482c17481b423.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p22)

>

>调用

>![499abff7c8d917c7f5ac2c24334387ca.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p23)

>

**3.在分类的方法中不能直接访问本类的私有属性,但是可以用setter、getter方法访问。**

>本类

>![0db76fcc6aa38c58a50a192c1670b7a7.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p24)

>

>分类中直接访问

>![af1fabc821ee7a4023f8641aa22a0f8b.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p25)

>

>分类通过setter、getter访问

>![0d3de563df0f80fd161fa9ac94cc7c90.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p26)

>

**4.当分类中有和本类重名的方法,优先调用分类的方法,即使没有引入分类的头文件。

如果多个分类中都有相同的方法,优先调用最后编译的方法**

>本类

>![0d3ce968ace73a32a571b79a1b6ed0fd.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p27)

>

>分类

>![a95aae804d9970ebc5c14b76951291b4.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p28)

>

>调用

>![e9c0567ca0f46222178b34b9267f6ebe.png](evernotecid://FC8F9BE6-C96B-46CC-A4C2-D17881C5458E/appyinxiangcom/34923786/ENResource/p29)

>

>控制台打印

>

```

2022-03-02 00:57:31.792788+0800 20220301_OC_category[2751:130371] 我是分类

```

##### 总结

>Q:什么时候使用分类?

>A:当一个类中的方法多而杂时,就是用分类。

举报

相关推荐

0 条评论