分类(category)和类扩展(extension)(二)
1.分类原则上只能添加“方法”,不能增加成员变量
- 但是我们可以用@property声明属性,编译和运行都会通过,只要不使用程序也不会崩溃。但如果调用了_成员变量和setter/getter方法,报错就在所难免了。
Category
Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
char *category_name OBJC2_UNAVAILABLE; // 分类名
char *class_name OBJC2_UNAVAILABLE; // 分类所属的类名
struct objc_method_list *instance_methods OBJC2_UNAVAILABLE; // 实例方法列表
struct objc_method_list *class_methods OBJC2_UNAVAILABLE; // 类方法列表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 分类所实现的协议列表
}
通过上面我们可以发现,这个结构体主要包含了分类定义的实例方法与类方法,其中
instance_methods 列表是 objc_class 中方法列表的一个子集,而class_methods列表是元类方法
列表的一个子集。
但这个结构体里面根本没有属性列表,
2.类扩展(extension)是category的一个特例,有时候也被称为匿名分类。他的作用是为一个类添加一些私有的成员变量和方法。
3.类扩展中添加的新方法,一定要实现。categorygory中没有这种限制。
//私有方法(如果不实现,编译时会报警,Method definition for ‘XXX’ not found)
- Category原则中只能增加方法(能添加属性的原因只是通过runtime解决没有setter和getter方法)
- Extension不仅可以增加方法,还可以增加属性,只是属性默认的访问权限是 private
- Extension中声明的方法没有在.m文件中实现,编译器会报警,但是在Category中的方法没有实现的话编译器是不会有任何警告的。这是因为Extension是在编译阶段添加到类中,而Categor是在运行时添加到类中的
- Extension不能像类别那样拥有独立的实现部分,他所声明的方法只能在其对应的类中实现
- Extension定义在.m文件的方法是私有的,定义在.h文件的方法是公有的
https://www.jianshu.com/p/9e827a1708c6