一、Category简介
分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。
注意:
1.分类是用于给原有类添加方法
的,因为分类的结构体指针中,没有属性列表
,只有方法列表。所以原则上讲它只能添加方法, 不能添加属性(成员变量)
,实际上可以通过其它方式添加属性;
2.分类中的可以写
@property, 但不会生成
setter/getter方法, 也不会生成
实现以及私有的成员变量(编译时会报警告);
3.可以在分类中访问原有类中.h中的属性;
4.如果分类中有和原有类同名的方法
, 会优先
调用分类
中的方法, 就是说会忽略原有类
的方法。所以同名方法
调用的优先级为 分类 > 本类 > 父类
。因此在开发中尽量不要覆盖原有类;
5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。分类格式:
@interface 扩展的类(分类的名称)
@end
@implementation 扩展的名称(分类的名称)
@end
例子:// Hex+Category.h文件中
@interface Hex (Category)
@property(nonatomic,copy) NSString *nameWithSetterGetter;
//设置setter/getter方法的属性
@property(nonatomic,copy) NSString *nameWithoutSetterGetter;
//不设置setter/getter方法的属性(注意是可以写在这,而且编译只会报警告,运行不报错)
- (void) colorCategoryMethod;
//分类方法
@end
一般在一个类中用@property声明属性,编译器会自动帮我们生成成员变量和setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成成员变量也无法生成setter/getter。最后结果:用@property声明属性,编译和运行都会通过,只要不使用程序也不会崩溃。但如果调用了_成员变量和setter/getter方法,报错就无法避免了。
二、Category创建方式
分类也叫类别创建步骤很简单如下:
1.新建一个Object-C File文件
(图1)2.点击Next进行下一步:
(图2)3.填好信息,点击Next一个NSString的分类就创建好了
三、Category使用范围
1.扩展已有的类。
2.引用父类未公开方法。
3.实现简单协议。
4.可以把类的实现分开在几个不同的文件里面。这样做有几个显而易见的好处,
- a)可以减少单个文件的体积。
- b)可以把不同的功能组织到不同的category里。
- c)可以由多个开发者共同完成一个类
- d)可以按需加载想要的category 等等。
5.声明私有方法。
6.模拟多继承。
7.把framework的私有方法公开。
网友评论