Objective C中具有相同函数名称的类别

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创建者为方法名称使用前缀?


你是否在同一个 .m 文件中导入了这两个类别? - nhisyam
2
那个方法调用的结果是未定义的。千万不要像这样发布任何东西。 - CodaFi
1个回答

16

这种行为是未定义的,应该避免。这里是相关文档:

避免类别方法名称冲突

因为在类别中声明的方法被添加到现有类中,所以必须非常小心地处理方法名称。

如果在类别中声明的方法名称与原始类中的方法名称相同,或者与同一类别上的其他方法名称相同(甚至是超类),则其具体实现在运行时会变得未定义。如果您正在使用自己的类别,则可能不太可能出现此问题,但在使用类别将方法添加到标准Cocoa或Cocoa Touch类时可能会出现问题。


1
什么是未定义行为的确切含义?如果我的目的正是如此,即使用类别来覆盖类方法的现有行为,那该怎么办? - RobDigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接