类的分类(Category)

1.什么是分类

分类是objective-C的一种机制,可以在不改动原有类的情况下给类添加新的方法和属性。
分类有正常分类和匿名分类
正常分类:一般用于扩展类的方法
匿名分类:比较特殊,外部不能访问,所以一般用来声明私有属性和方法

2.为什么要分类

  1. 不侵入性: 使用分类,你可以在不修改现有类的情况下,为其添加新的方法。这种非侵入性的特性允许你扩展现有的类,而无需改变其源代码,从而保持了代码的稳定性。

  2. 代码组织: 分类使得相关的方法可以被组织到不同的文件中,提高了代码的可读性和可维护性。你可以将不同功能的方法放置在不同的分类中,使得代码结构更加清晰。

  3. 可重用性: 通过分类,你可以将一组相关的方法封装在一起,形成一个可重用的代码单元。这些方法可以在不同的类中共享,提高了代码的重用性。

  4. 遵循单一职责原则: 引入分类可以帮助你遵循单一职责原则,即每个类应该只有一个引起它变化的原因。将相关的方法分散到不同的分类中,使得每个分类只负责一种功能。

  5. 隐藏私有实现细节: 使用匿名分类,你可以声明私有属性和私有方法,将这些实现细节隐藏在类的内部,提高了类的封装性。

  6. 动态加载: 分类的方法在运行时动态加载,这意味着你可以在不重启应用的情况下,动态地添加新的方法,实现了更加灵活的代码架构。

3.如何使用分类

3.1正常分类

3.1.1 创建分类

需要单独在一个头文件,一般是“类名+分类名”的方式命名头文件
声明分类:
@interface 类名 (分类名)

如:我需要给我的AClass类创建一个pB的分类,添加printB方法
AClass+pB.h

#import <Foundation/Foundation.h>
#import "AClass.h"   //注意:要导入原来的类
@interface AClass (pB)

- (void)printB;

@end

AClass+pB.m

#import "AClass+pB.h"
@implementation AClass (pB)

- (void)printB {
    NSLog(@"正常分类 B");
}

@end

3.1.2 使用分类方法

直接调用就可以了,记得要添加分类的头文件,不然找不到分类里的方法

#import <Foundation/Foundation.h>
#import "AClass.h"
#import "AClass+pB.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        AClass *aClass = [AClass new];
        [aClass printB];     // 这个调用的是分类里的方法
        
    }

    return 0;
}

3.2匿名分类

3.2.1 创建分类

需要与原来的类在同一个文件里
声明分类:
@interface 类名 ()

如:给AClass类用匿名类的方式添加私有属性
AClass.m

#import "AClass.h"

//匿名分类用于添加私有属性
@interface AClass ()

@property (nonatomic, copy)NSString *name;
@property int age;

@end


@implementation AClass

- (void)printA {
    NSLog(@"name: %@", self.name); //打印name
    NSLog(@"age: %d", self.age);   //打印age
}

@end

4.分类实现原理

分类实现主要靠Runtime机制,实现动态链接,在程序运行时,Runtime会将这个新的方法列表关联到原始类的Class对象上。
注意:如果一个类的多个分类中存在相同的方法名,Runtime会根据编译顺序(即文件的顺序)来确定使用哪个方法实现。所以避免出现相同的方法名。

猜你喜欢

转载自blog.csdn.net/yoyo_u/article/details/134250219
今日推荐