5

如果一个 XCode 项目有两个类别:

@implementation NSData (test1)
- (void) testData {
     NSLog(@"test data 1");
} 
@end

@implementation NSData (test2)
- (void) testData {
     NSLog(@"test data 2");
} 
@end

这个的预期输出是什么:

NSData* testData = [[NSData alloc] init];
[testData testData];

我得到的输出总是

#import "NSData+test1.h"

对此有何解释?有没有办法强制第一类?

这里的问题是,如果您要导入两个具有相同名称类别的静态库的 SDK,您如何解决这个问题。我假设唯一的方法是要求 SDK 创建者为方法名称使用前缀?

4

1 回答 1

16

该行为未定义,应避免。以下是相关文档

避免类别方法名称冲突

因为在类别中声明的方法被添加到现有类中,所以您需要非常小心方法名称。

如果在一个类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至超类)上的另一个类别中的方法相同,则行为未定义至使用哪种方法实现运行时。如果您将类别与您自己的类一起使用,这不太可能成为问题,但在使用类别向标准 Cocoa 或 Cocoa Touch 类添加方法时可能会导致问题。

于 2013-03-15T02:30:26.887 回答