1,类别的目的:
1)代替子类
2)对类进行扩展
3)类方法的归类
2,类别基本注意事项
1,为一个类创建分类,其实就是把它的实现分为几部分;每个类别都是类的一部分;一个类可以有多个分类,但是在每一个分类中只能为原有类增添方法,不能增添实例变量;对于一个不想公开源代码的类来说,为它创建分类是很有必要的。
2,可以为一个类写很多的分类,但是这些分类都是原有类的一部分,其中的成员也会被子类继承。
3,对于分类来讲,它里面的方法,如果不需要的话,可以不去实现;分类只能添加方法不能添加实例变量,分类可以重写已有类的方法,但是一般不这么做,需要重写的时候一般用继承。
4,如果一个类多个分类中使用相同的方法名,在使用的时候编译器也不知道要执行那个方法,所以在写分类时候,方法名不要重名。
5,分类中子类可以通过super关键字调用到父类的方法,但是分类中无法调用到被覆盖的方法。
6,分类的限制:类别和继承关系不能同时出现。
7,分类中既可以定义实例方法也可以定义类方法
8,分类的接口部分必须引用主文件中的接口文件;分类的接口文件,必须引用对应的接口文件;使用分类中的方法必须使用这个分类所在的头文件。
3,分类的用途
1)作为子模块的范畴(分类)
如果有很多方法的,规模很大的类,把所有的实现部分都写在一个文件中就比较不方便。这时候可以利用分类的特性,将联系紧密的方法作为一个范畴来进行分类类似于C中把某些函数写在同一个文件中一样,这样把类中依赖性比较高的部分归纳一起,开发会变的更加容易。
由多个范畴组成的类,就好像是给主类加上了各种选项,需要靠程序员来保证主类和各种范畴能够作为一个整体来正常工作。
2)私有方法
定义一个不对外公开的类的分类,在分类中定义私有方法和私有的全局变量,这时候,需要用到这些方法或者变量的时候,在其它公开的类中引入私有的分类u定义即可,用这种方法来私下私有方法和私有变量。
3)类扩展
类扩展中声明的方法必须在类的实现文件中实现,不管是否引入了类扩展的定义,只要在类的实现部分没有实现对应的方法,就会出现编译报错。 因此可以利用这个特性,将必须要实现的私有方法放到类扩展中,这样可以防止漏掉实现这个方法 的情况。
类扩展中声明的实例变量只能在引入了主类的接口和扩展声明的范畴中使用。主类的实现部分也可以声明实例变量,但是声明的变量只能在该文件中使用,类扩展中定义的变量可以在多个分类中使用。
类扩展的注意事项:
- 所谓的扩展,其实就是为一个类添加额外的原来没有的方法或者合成属性;
- 扩展中,只能扩展合成属性和方法,不能添加字段,否则会编译错误;
- 定义在 .m 文件中的扩展为私有的,定义在 .h 文件(头文件)中的扩展为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。
- 类扩展中的声明的方法与在类中声明的方法是完全一致的,这些方法必须在随后的代码中实现,在编译时会被添加到类中,而分类是在运行时进行添加的。