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

Mat*_*rix 5 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
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ong 8

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

底线:不要这样做.:)


Bar*_*ark 4

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

许多为现有(例如 Cocoa)类提供类别的 Cocoa 框架都遵循一种模式,将其类前缀添加到方法中,以尽量减少名称冲突的可能性。因此,例如,您可以创建如下类别:

@interface NSObject (MyCategory)
- (void)myprefix_categoryMethod;
@end
Run Code Online (Sandbox Code Playgroud)

  • +1,但我建议使用后缀而不是前缀。这样您仍然可以使用自动完成功能,而不必记住您想要的方法实际上是类别方法。 (6认同)