Objective-C Categories/类别
有时候,可能会发现,想扩展现有的类添加行为,只在某些情况下是有用的。为了添加这样的扩展到现有类,可使用 Objective-C 类别和扩展。
如果需要向现有类添加一个方法,可能是添加功能,使其更容易在自己的应用做一些事情,最简单的方法是使用一个类别。
声明一个类的语法使用@ interface关键字,就像一个标准的Objective-C类描述,但并不表示任何从子类继承。相反,它指定括号中的类别,这样的名称:
@interface ClassName (CategoryName) @end
类别的特性
-
一个类别可声明任何类,即使不具备原来的实现源代码。
-
任何一个类别中声明的方法将所有的原始类的实例,以及任何原始类的子类。
-
在运行时,一个类别添加方法没有任何区别,一个是通过原来的类。
现在,让我们来看看样本类别执行。让我们添加可可类NSString的一个类别。此类别将有可能为我们增添了一种新方法getCopyRightString,这有助于我们在返回的版权字符串。如下所示。
#import <Foundation/Foundation.h> @interface NSString(MyAdditions) +(NSString *)getCopyRightString; @end @implementation NSString(MyAdditions) +(NSString *)getCopyRightString{ return @"Copyright Tutorialsgitbook.net 2013"; } @end int main(int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *copyrightString = [NSString getCopyRightString]; NSLog(@"Accessing Category: %@",copyrightString); [pool drain]; return 0; }
现在,当我们编译并运行程序,我们会得到以下的结果。
2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright Tutorialsgitbook.net 2013
尽管任何一个类别添加方法类及其子类的所有实例,需要导入类的头文件在源代码文件中任何你想使用额外的方法,否则会碰到编译器警告和错误。
在我们的例子中,因为我们只需要一个单一的类,我们还没有包括任何头文件,在这种情况下,我们应该包含头文件,如上面所说的。