Objective-C 类别



有时,您可能会发现希望通过添加仅在某些情况下有用的行为来扩展现有类。为了向现有类添加此类扩展,Objective-C 提供了**类别**和**扩展**。

如果您需要向现有类添加方法,也许是为了添加功能以方便您在自己的应用程序中执行某些操作,最简单的方法是使用类别。

声明类别的语法使用 @interface 关键字,就像标准的 Objective-C 类描述一样,但没有指示从子类的继承。相反,它在括号中指定类别的名称,如下所示:

@interface ClassName (CategoryName)

@end

类别的特点

  • 可以为任何类声明类别,即使您没有原始的实现源代码。

  • 您在类别中声明的任何方法都将可用于原始类的所有实例,以及原始类的任何子类。

  • 在运行时,类别添加的方法与原始类实现的方法之间没有区别。

现在,让我们看看一个类别实现示例。让我们向 Cocoa 类 NSString 添加一个类别。此类别将使我们能够添加一个新的方法 getCopyRightString,该方法帮助我们返回版权字符串。如下所示。

#import <Foundation/Foundation.h>

@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end

@implementation NSString(MyAdditions)

+(NSString *)getCopyRightString {
   return @"Copyright TutorialsPoint.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 TutorialsPoint.com 2013

即使类别添加的任何方法都可用于类及其子类的所有实例,您也需要在希望使用附加方法的任何源代码文件中导入类别头文件,否则您将遇到编译器警告和错误。

在我们的示例中,由于我们只有一个类,因此我们没有包含任何头文件,在这种情况下,我们应该像上面所说的那样包含头文件。

广告

© . All rights reserved.