发布于 2015-07-05 11:48:32 | 188 次阅读 | 评论: 0 | 来源: 网络整理
有时候,可能会发现,想扩展现有的类添加行为,只在某些情况下是有用的。为了添加这样的扩展到现有类,可使用 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 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
尽管任何一个类别添加方法类及其子类的所有实例,需要导入类的头文件在源代码文件中任何你想使用额外的方法,否则会碰到编译器警告和错误。
在我们的例子中,因为我们只需要一个单一的类,我们还没有包括任何头文件,在这种情况下,我们应该包含头文件,如上面所说的。