返回

您虽不曾遇见,却已习惯了Category的存在

IOS

category在语言学中,是事物的总体概括。在Objective-C中,category同样是对类或协议的一种扩展,它为类增加了新的方法,而不必创建子类。category是一个类目或类型,具有定义上的一致性和整体性,可以用于一类事物的性质或特征。

它的本质是一个category_t的结构体,内存中包含了name(分类名称)、class(分类属于的类)、对象方法列表、类方法列表、属性列表、协议列表。

category的特性:

  • 一个类别只属于一个类
  • 类别的集合是动态的,甚至可以加载一个派生类的类别到一个根类中。
  • 不能为category添加变量
  • category不能重载原有类的属性或方法
  • 可以为类别添加@property属性,但没有存储空间,只能通过方法访问

category的应用场景:

  • 当需要为类添加新方法而不想创建子类时。
  • 当需要为多个类添加相同的方法时。
  • 当需要隐藏实现细节时。

category作为Objective-C中的一种扩展机制,它允许在不修改源代码的情况下为类添加新的方法。这使得代码更加模块化和易于维护。在实际开发中,category的使用非常广泛,例如:

  • 为UIKit类添加新的方法。
  • 为第三方库的类添加新的方法。
  • 为自定义类添加新的方法。

category的使用非常简单,只需要在头文件中导入category的定义,然后在实现文件中实现category中的方法即可。

例如,为NSString类添加一个新的方法reverseString:

// 头文件
#import <Foundation/Foundation.h>

@interface NSString (MyCategory)

- (NSString *)reverseString;

@end
// 实现文件
#import "NSString+MyCategory.h"

@implementation NSString (MyCategory)

- (NSString *)reverseString {
  NSMutableString *reversedString = [NSMutableString stringWithCapacity:self.length];
  for (NSInteger i = self.length - 1; i >= 0; i--) {
    [reversedString appendFormat:@"%c", [self characterAtIndex:i]];
  }
  return reversedString;
}

@end

现在,我们就可以使用NSString的reverseString方法了。

NSString *string = @"Hello, World!";
NSString *reversedString = [string reverseString];
NSLog(@"%@", reversedString); // 输出:"!dlroW ,olleH"

category是一种非常灵活和强大的机制,它可以帮助我们更轻松地编写Objective-C代码。