原文地址:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Category.html
你使用类别来给一个已经存在的类不使用子类的方式来添加额外的方法--甚至那些是哪些源代码不对你开放的。你通常使用类别来给一个已经存在的类添加方法,比如一个在Cocoa frameworks中的定义。添加的方法可以被子类继承而且和在运行时中类的原有方法没什么区别。你能使用你自己的类别来:
1.可以通过单独发布文件来分发你的类--例如,你可以组合一个很臃肿的类的方法到几个类别,然后将每个类别放到不同的文件里
2.定义私有方法。
你通过在一个文件里添加许多方法到一个类来定义他们,并且通过一个类别名和定义他们的类的名字类命名他。类别的名字表示这些方法是一个类的拓展,而不是一个新类。
声明
类别的接口的声明看起来很像类的接口定义==只是类别名字后面跟随着一个括号并且他的父类里面没有提到。一个类别必须导入他的接口文件:
#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