分类:Category
iOS中的分类主要的作用就是为类提供扩展,增加一些方法。但是只能添加方法 不能添加属性?
我们查看category的定义:
在分类的结构体里面并没有属性列表,有方法列表,原则上来说 它只能添加方法,不提供添加属性。
typedef struct objc_category *Category;
struct objc_category {
char * _Nonnull category_name OBJC2_UNAVAILABLE;//分类名称
char * _Nonnull class_name OBJC2_UNAVAILABLE;//原类的名字
struct objc_method_list * _Nullable instance_methods OBJC2_UNAVAILABLE;//实例方法列表
struct objc_method_list * _Nullable class_methods OBJC2_UNAVAILABLE;//类方法列表
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;//分类实现协议
} OBJC2_UNAVAILABLE;
分类的作用
1:可以为类分为多个模块,方便管理
2:扩展一个类,给原来的类添加方法,特别是扩展系统自带的类或者一些第三方框架。
注意:
1:分类只能添加方法,不能添加属性。
2:分类中可以写成@property,但是不会生成setter getter方法
3:分类中可以访问原来的成员变量,但是只能访问@protect @public形式的变量,如果想要访问本类的私有变量,分类和子类一样,只能通过方法来访问。
4:如果分类中和原有类中有同名的方法,会优先调用分类中的方法,就是忽略原来的方法
5:如果多个分类中都有和原来的类中同名 的方法,那么调用该分类中的方法的时机有编译器来决定,编译器会执行最后一个参与编译的分类的种的方法
可以在 TARGETS->Build Phases ->Compile Sources 修改(注意执行顺序是从上到下的)
类扩展:Extension
Extension(类扩展)是Category的一个特例;
类扩展没有名字,只有声明没有实现,与原类共享方法实现。是category一个特例,有时候也可以称为匿名分类,他的作用就是为一个类添加私有的成员变量和方法。