除了继承,我们还可以使用类别来为已有的类添加新方法,即使该类的源码是非公开的。例如你可以为Cocoa frameworks中现有的类添加方法。新添加的方法会被子类继承,运行时,类别方法和类方法没有任何区别。你同样可以在你自己类中使用类别实现如下目的:
- 将你自己类的实现部分分散到不同的源文件中,例如你可以将一个大类的方法分组到多个类别中,并将各个类别放到不同的文件中。
- 申明私有方法
要类添加一个方法,你可以在接口文件中的类别名称下申明该方法,并在相同名称的实现文件中实现方法。类别名称指明这是其他类的一个扩展,而非一个新类。
申明
类别的申明跟类的申明非常类似-除了类别名是列在类名后面的圆括号里,并且不用指明父类。类别必须要导入要扩展类的接口文件:
#import "SystemClass.h"
@interface SystemClass (CategoryName)
// method declarations
@end
一个约定俗成的取名方法是要扩展的类名+类别名称,这个类别可能在一个SystemClass+CategoryName.h文件中申明。
如果你通过类别来为你自己的类添加一个私有方法,你可以把申明放在实现文件的 @implementation 模块之前:
#import "MyClass.h"
@interface MyClass (PrivateMethods)
// method declarations
@end
@implementation MyClass
// method definitions
@end
实现
如果你要通过类别来申明一个你自己类的私有方法,你可以将实现放在@implementation模块内。如果你通过类别来扩展一个你不知源代码的类,或者实现你自己的类,你可以将实现在放在一个名称为<ClassName>+CategoryName.m的文件中。这个实现导出他自己的接口。因此一个类别的实现应该是这样的:
#import "SystemClass+CategoryName.h"
@implementation SystemClass ( CategoryName )
// method definitions
@end