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 Jc2182.com 2020";
    }
    
    @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;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-21 09:07:14.900 helloWorld[7852:8336] Accessing Category: Copyright Jc2182.com 2020
    
    即使类别添加的任何方法都可用于该类及其子类的所有实例,您仍需要在要使用其他方法的任何源代码文件中导入类别头文件,否则会遇到编译器警告和错误。在我们的示例中,由于我们只有一个类,因此我们没有包含任何头文件,在这种情况下,我们应该包括上述头文件。