如果两个不同的类别具有相同的方法,那么哪一个将由目标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];,那么哪一个叫?为什么?
答案 0 :(得分:8)
未定义。它取决于运行时首先加载哪个类别,是否没有记录的顺序发生。
底线:不要这样做。 :)
答案 1 :(得分:4)
正如@Dave DeLong所述,行为未定义。其中一种方法将“获胜”,而且无法知道哪一种方法。如果任何其他代码依赖于丢失方法,您将发现自己调试一些可能奇怪的错误。最好一起避免这种情况。在实现“明显的”辅助方法时,这是一个特殊的问题。如果这些方法在未来的框架版本中添加,您的类别将覆盖类中的新方法(如果它在主类主体中)或可能覆盖该方法(如果它添加在类别中)。伊克。
为现有(例如Cocoa)类提供类别的许多Cocoa框架遵循一种模式,即它们将类前缀添加到方法中,以便最小化名称冲突的可能性。因此,例如,您可以创建类别:
@interface NSObject (MyCategory)
- (void)myprefix_categoryMethod;
@end