分类category
如果把全部方法写在一个模块里面,后期难以维护和管理,分类就是将一个类分为多个模块
- 创建类的时候选择
category
- 模块的文件名:
本类名+分类名.h
本类名+分类名.m
- 当一个类很杂,可以使用分类,将相似的方法写在同一个模块之中
/// 代表对已有的类添加一个分类,一个类可以有多个分类,分类用名字区分
@interface Student (itcast分类名)
@end
@implementation Student (itcast分类名)
@end
分类的使用
- 要访问分类中定义的成员,就要把分类的头文件引进来
- 分类只能增加方法,不能增加属性
- 分类可以使用
@property
,但是不会生成私有属性,也不会生成getter setter
的实现,只会生成getter setter
的声明,可以去本类中定义属性,自己在分类中写getter setter
的实现 - 在分类的方法实现中不可以直接访问本类的真私有属性(定义在
@implementation
之中),但是可以调用本类的getter setter
来访问属性 - 当分类中同名方法的时候,优先调用分类的方法,哪怕没有引入分类的头文件,如果多个分类有相同的方法,优先调用最后编译的分类
非正式协议
为系统自带的类写分类,这个叫做非正式协议
- 为已经存在的类添加方法
延展Extension
特殊的分类,也是类的一部分
延展这个特殊的分类没有名字,只有声明没有实现,和本类共享一个实现
一般将延展直接写在本类是实现文件中,用于生成内部私有属性和私有方法
// 声明
@interface 本类名()
@end
// 没有实现,和本类共享一个实现
- 延展和分类的区别:分类只能新增方法,延展中任意成员都可以写
- 分类可以写
@property
,但是只会生成getter setter
的声明 - 延展写
@property
,会自动生成私有属性,也会生成getter setter
的声明和实现 - 应用场景:要为类写一个私有的
@property
,生成的getter setter
方法只能内部访问,不能外部访问 - 定义一个真私有属性或者私有方法可以定义在
@implementation
之中,但是不规范,写一个延展,将其定义在延展之中