类别与扩展
类别使得我们可以为既存的类增加新的方法,甚至是为那些自己都没有源代码的类增加新的方法。因此类别是一种不用继承就可以扩展类的功能的机制。使用类别还可以使得我们把类的实现分散到多个文件中。扩展与类别有些类似。但是扩展使得我们可以在@interface代码块之外为类声明必要的API接口。
为类增加方法
我们可以在接口文件中通过使用类别来为类增加新的方法。这些方式是在类别的实现文件中被实现的。类别的名称表明指定的类是在别的地方声明的类,而不是一个新的类。不能企图通过类别的方式来为类增加实例变量。
通过类别为类增加的方法构成了类的一部分。比如,编译器会把通过类别为NSArray类增加的方法看作是该类的必要组成部分。通过类别为NSArray的派生类增加的方法则不是NSArray类的组成部分。
通过类别的方式为类增加的方法可以完成任何对于该类来说有意义的事情。在运行时,这种方法和类中固有的方法没有任何区别。通过类别的方式为类增加的方法会被该类的所有派生类继承,正如其他固有的方法一样。
类别的声明和类接口的声明很相似。不同之处在于类别的名称位于类名后面的一对圆括号中。类别文件中必须引入他所扩展的类的接口文件,除非在类别中的方法不会访问任何类的实例变量,如下:
#import “ClassName.h”
@interface 类名称(类别名称)
{
//声明方法
}
@end
在实现文件中也要引入对应的接口文件。类别文件的命名,按照惯例采用“类名+类别名称”的方式。因此,类别的实现文件可能如下:
#import “类名+类别名.h”
@implementation 类名(类别名)
//方法的实现
@end
注意:在类别中是不能为类增加新的实例变量的,只能新增方法。然而,类中声明的所有实例变量对类别来说都是可见的,甚至包括@private的变量。
对类增加的类别的数量是没有限制的。但是这些类别必须是不同的,每个类别必须定义自己的方法,这些方法不能与其他的类别中的方法相同。