Objective-C类别(Category)用法解析 – Objective-C开发教程

上一章Objective-C开发教程请查看:Objective-C类设计和数据封装
Objective-C的类别Category也是个奇葩,用处不大,嫌麻烦用继承就好了。实际上OC的类别就类似于继承,而扩展extension就是个匿名类别,所以你看用继承不就好了,偏偏多了类别和扩展,所以还是建议能不用就不用。
下面是类别的声明和实现的语法:

// 声明类别,类别名称为CategoryName @interface ClassName (CategoryName)@end@implementation ClassName (CategoryName)@end

【Objective-C类别(Category)用法解析 – Objective-C开发教程】类别CategoryName表示对原有的类ClassName进行方法上的扩展,也就是只能增加方法。其实CategoryName类别有如给ClassName类嵌入了一些功能,使用的时候依然是使用ClassName,此时就包含了CategoryName中的方法,即使继承同样可以使用。
但是要记住,最好显式导入类别的头文件。
类别的特点
  • 你可以为任何类声明一个类别,即使没有源码(继承也不用源码呢!)
  • 在类的类别中声明的方法可以供类的所有实例使用,包括类的子类(继承也可以呢!)
  • 在类别中添加的方法和类的方法没有任何区别。
  • 无法向现有类中添加新的实例变量。
  • 添加同名方法会预先使用类别中的方法。
是不是开始觉得其实类别有些多余了?类都是程序员手动使用的,在没有这个类的源码的情况下,有一种情况是特别需要类别的:有一个第三方函数接口使用到该类,而又没有这个类的源码,而这时我特别需要这个类有一个额外的方法。。。
下面是类别的一个简单的例子,这是对NSString类的扩展:
#import < Foundation/Foundation.h>@interface NSString(MyAdditions) +(NSString *)getCopyRightString; @end@implementation NSString(MyAdditions)+(NSString *)getCopyRightString { return @"Copyright srcmini.com 2019"; }@endint main(int argc, const char * argv[]) { NSString *copyrightString = [NSString getCopyRightString]; NSLog(@"访问类别: %@",copyrightString); return 0; }

不过还是那句话,能不用就不用,而上面说到使用类别的那种情况,也太偏门了,如果遇到也可以用。

    推荐阅读