Category的”方法覆盖规则”

Category的”方法覆盖规则”

问题描述

有一个类MyClass.

// MyClass.h文件
@interface MyClass : NSObject

+ (void)sqi_print;

@end

// MyClass.m文件
@implementation MyClass

+ (void)sqi_print {
    NSLog(@"-> MyClass");
}

@end

新建一个 MyClass 的分类SQI_CAT_ONE

// MyClass+SQI_CAT_ONE.h文件
@interface MyClass (SQI_CAT_ONE)

+ (void)sqi_print;

@end

// MyClass+SQI_CAT_ONE.m文件
@implementation MyClass (SQI_CAT_ONE)

+ (void)sqi_print {
    NSLog(@"-> MyClass (SQI_CAT_ONE)");
}

@end

再新建另一个 MyClass 的分类SQI_CAT_TWO

// MyClass+SQI_CAT_TWO.h文件
@interface MyClass (SQI_CAT_TWO)

+ (void)sqi_print;

@end

// MyClass+SQI_CAT_TWO.m文件
@implementation MyClass (SQI_CAT_TWO)

+ (void)sqi_print {
    NSLog(@"-> MyClass (SQI_CAT_TWO)");
}

@end

在 ViewController 中引入两个分类

#import "ViewController.h"
#import "MyClass+SQI_CAT_TWO.h"
#import "MyClass+SQI_CAT_ONE.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    [MyClass sqi_print];
}

@end

控制台打印结果

情况1 -> MyClass+SQI_CAT_TWO.m文件后编译

情况1 -> 控制台打印

情况2 -> MyClass+SQI_CAT_ONE.m文件后编译

情况2 -> 控制台打印

分类覆盖规则分析

  1. App的启动的时候(load方法之前), 会把分类中的类方法列表和原类中的类方法列表拼接成一个新的类方法列表, 而且分类中的方法会放在新列表的前面.
  2. 具体是哪一个分类中的方法处于更前面, 这取决于编译顺序.
  3. 运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休^_^,殊不知后面可能还有一样名字的方法。

发表评论

邮箱地址不会被公开。 必填项已用*标注