Objective-C Categories/类别 - Objective-C教程

有时候,可能会发现,想扩展现有的类添加行为,只在某些情况下是有用的。为了添加这样的扩展到现有类,可使用 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 TutorialsYiibai.com 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 TutorialsYiibai.com 2013

尽管任何一个类别添加方法类及其子类的所有实例,需要导入类的头文件在源代码文件中任何你想使用额外的方法,否则会碰到编译器警告和错误。

在我们的例子中,因为我们只需要一个单一的类,我们还没有包括任何头文件,在这种情况下,我们应该包含头文件,如上面所说的。