Cocoa Fundamentals Guide-Category

专业词汇就不翻译了,翻译了看起来反而别扭。

Category

Category可以让你不通过继承就增加一个类的方法。在Category中定义的方法会成为这个类的一部分(只限于你的程序范围内)。更cool的是所有的子类也可以使用这些在Category中定义的方法。当程序运行的时候,通过Category添加的方法和在类中定义的方法没有任何区别。你可以向类的任何实例(包括子类的实例)发送消息调用在Category中定义的方法。

Category不仅是增加类行为的一种方便的途径,你也可以通过Category把对象的方法按功能或者按数据进行分类,将有关联的方法整理到一个Category中。Category能特别方便的管理很大的类。比如有多个开发人员共同开发一个类,你甚至可以把不同的Category放在不同的文件中,(疑问是想说多个开发人员通过不同category共同扩展一个类么?那怎么调用呢?

声明和实现Category在语法上和继承几乎一样。在语法上,他们就只在名字上有区别,定义Category需要在@interface和@implements后面的名字外面加上小括号。(真绕啊这句话,看例子一下就明白了,吐舌头)比如你想给NSString加个方法以树状的方式显示集合对象的描述信息。这个Category的头文件定义如下(终于代码了):

#import <Foundation/NSArray.h> // if Foundation not already imported

 

@interface NSArray (PrettyPrintElements)

- (NSString *)prettyPrintDescription;

@end

相应的.m文件如下

#import "PrettyPrintCategory.h"

 

@implementation NSArray (PrettyPrintElements)

- (NSString *)prettyPrintDescription {

    // implementation code here...

}

@end
对于Category,这有一些限制。你不能通过Category给一个类添加变量。虽然通过Category可以复写类中已经有的方法,但我们不建议你这么做,特别是你想增加这个方法的行为。 原因是因为category中的方法是类接口的一部分,如果你覆写了类中的一个方法,你就没有办法调用父类中定义的这个方法。( 真绕,是想说,如果我在category覆写方法A,我就不能用[super A],因为这个时候[super A]实际上是调用你在Category中覆写的A。。。要试验下)如果你确实需要修改一个已有的方法,那你最好还是通过子类来实现吧。

你可以通过Category给根类NSObject添加新的方法。在你的代码中,所有的实例和对象都可以使用这个新增的方法。Informal protocols-Cocoa代理机制的基本类型-就是在NSOject上通过Category声明的。通过NSObject上的Category添加到每个对象的方法可能造成不可预制的结果,导致系统崩溃,数据损坏,甚至更糟,所以慎用。

你可能感兴趣的:(cocoa,扩展,interface)