上一章Objective-C开发教程请查看:Objective-C类设计和数据封装
Objective-C的类别Category也是个奇葩,用处不大,嫌麻烦用继承就好了。实际上OC的类别就类似于继承,而扩展extension就是个匿名类别,所以你看用继承不就好了,偏偏多了类别和扩展,所以还是建议能不用就不用。
下面是类别的声明和实现的语法:
// 声明类别,类别名称为CategoryName
@interface ClassName (CategoryName)
@end
@implementation ClassName (CategoryName)
@end
类别CategoryName表示对原有的类ClassName进行方法上的扩展,也就是只能增加方法。其实CategoryName类别有如给ClassName类嵌入了一些功能,使用的时候依然是使用ClassName,此时就包含了CategoryName中的方法,即使继承同样可以使用。
但是要记住,最好显式导入类别的头文件。
类别的特点
- 你可以为任何类声明一个类别,即使没有源码(继承也不用源码呢!)
- 在类的类别中声明的方法可以供类的所有实例使用,包括类的子类(继承也可以呢!)
- 在类别中添加的方法和类的方法没有任何区别。
- 无法向现有类中添加新的实例变量。
- 添加同名方法会预先使用类别中的方法。
是不是开始觉得其实类别有些多余了?类都是程序员手动使用的,在没有这个类的源码的情况下,有一种情况是特别需要类别的:有一个第三方函数接口使用到该类,而又没有这个类的源码,而这时我特别需要这个类有一个额外的方法。。。
下面是类别的一个简单的例子,这是对NSString类的扩展:
#import <Foundation/Foundation.h>
@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end
@implementation NSString(MyAdditions)
+(NSString *)getCopyRightString {
return @"Copyright srcmini02.com 2019";
}
@end
int main(int argc, const char * argv[]) {
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"访问类别: %@",copyrightString);
return 0;
}
不过还是那句话,能不用就不用,而上面说到使用类别的那种情况,也太偏门了,如果遇到也可以用。
评论前必须登录!
注册