个性化阅读
专注于IT技术分析

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

上一章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;
}

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

赞(0)
未经允许不得转载:srcmini » Objective-C类别(Category)用法解析 – Objective-C开发教程

评论 抢沙发

评论前必须登录!