如果两个不同的类别具有相同的方法,那么哪一个将由Objective C运行时系统调用?

时间:2010-09-10 16:08:21

标签: objective-c

如果两个不同的类别具有相同的方法,那么哪一个将由目标C运行时系统调用?

例如:

@interface ClassA (MathOps)
    -(void)CategoryMethod;
@end 

@interface ClassA (MathOps1)
-(void)CategoryMethod;
@end 

@implementation ClassA(MathOps1)
- (void) CategoryMethod{
    NSLog(@"Inside Category Method 2");
}
@end

@implementation ClassA(MathOps)
- (void) CategoryMethod{
    NSLog(@"Inside Category Method 1");
}
@end

现在,如果我正在呼叫,[ObjClassA CategoryMethod];,那么哪一个叫?为什么?

2 个答案:

答案 0 :(得分:8)

未定义。它取决于运行时首先加载哪个类别,是否没有记录的顺序发生。

底线:不要这样做。 :)

答案 1 :(得分:4)

正如@Dave DeLong所述,行为未定义。其中一种方法将“获胜”,而且无法知道哪一种方法。如果任何其他代码依赖于丢失方法,您将发现自己调试一些可能奇怪的错误。最好一起避免这种情况。在实现“明显的”辅助方法时,这是一个特殊的问题。如果这些方法在未来的框架版本中添加,您的类别将覆盖类中的新方法(如果它在主类主体中)或可能覆盖该方法(如果它添加在类别中)。伊克。

为现有(例如Cocoa)类提供类别的许多Cocoa框架遵循一种模式,即它们将类前缀添加到方法中,以便最小化名称冲突的可能性。因此,例如,您可以创建类别:

@interface NSObject (MyCategory)
- (void)myprefix_categoryMethod;
@end