有时,可能会发现希望通过添加仅在某些情况下有用的行为来扩展现有类。 要向现有类添加此类扩展,Objective-C提供了类别和扩展。
如果需要向现有类添加方法,或许为了添加功能以便在应用程序中更容易地执行某些操作,最简单的方法是使用类别。
声明类别的语法使用@interface
关键字,就像标准的Objective-C类描述一样,但不表示子类的任何继承。在括号中指定类别的名称,如下所示 -
1 @interface ClassName (CategoryName) 2 3 @end
1. 类别的特征
即使没有原始实现源代码,也可以为任何类声明类别。在类别中声明的任何方法都可用于原始类的所有实例,以及原始类的任何子类。
在运行时,类别添加的方法与原始类实现的方法之间没有区别。
现在,来看一个类别实现的示例。在Cocoa类NSString
中添加一个类别。此类别将使可以添加一个新方法getCopyRightString
,它返回版权字符串。 如下所示 -
1 #import <Foundation/Foundation.h> 2 3 @interface NSString(MyAdditions) 4 +(NSString *)getCopyRightString; 5 @end 6 7 @implementation NSString(MyAdditions) 8 9 +(NSString *)getCopyRightString { 10 return @"Copyright y ii bai.com 2019"; 11 } 12 13 @end 14 15 int main(int argc, const char * argv[]) { 16 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 17 NSString *copyrightString = [NSString getCopyRightString]; 18 NSLog(@"Accessing Category: %@",copyrightString); 19 20 [pool drain]; 21 return 0; 22 }
执行上面示例代码,得到以下结果:
2018-11-16 02:45:34.949 main[131207] Accessing Category: Copyright y ii bai.com 2019
即使类别添加的任何方法都可用于类及其子类的所有实例,仍需要在任何源代码文件中导入类别头文件,否则将遇到编译器警告和错误。
在上面示例中,由于只有一个类,因此没有包含任何头文件,在这种情况下应该包含如上所述的头文件。