2010-09-10 15 views
5

Si dos categorías diferentes tienen el mismo método, ¿cuál será invocado por el sistema de tiempo de ejecución del objetivo C?Si dos categorías diferentes tienen el mismo método, ¿cuál será invocado por el sistema de tiempo de ejecución Objective C?

por ejemplo:

@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 

Ahora bien, si yo estoy llamando, [ObjClassA CategoryMethod] ;, Entonces cuál llama? Por qué ?

Respuesta

4

Como dice @Dave DeLong, el comportamiento no está definido. Uno de los métodos "ganará", y simplemente no hay forma de saber cuál. Si cualquier otro código depende del método de perder, se encontrará eliminando errores potencialmente extraños. Lo mejor es evitar la situación todos juntos. Este es un problema particular cuando se implementan métodos de ayuda "obvios". Si esos métodos se agregan en una futura versión del marco, su categoría anulará el nuevo método en la clase (si está en el cuerpo principal de la clase) o puede anular el método si se agrega en una categoría. Eek.

Muchos marcos de trabajo Cocoa que proporcionan categorías para las clases existentes (por ejemplo, Cocoa) siguen un patrón por el cual anteponen su prefijo de clase al método con el fin de minimizar la posibilidad de colisión de nombre. Entonces, por ejemplo, crearía categorías como:

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

+1, excepto que recomendaría usar un sufijo en lugar de un prefijo. De esta forma, aún puede usar la función autocompletar sin tener que recordar que el método que desea es en realidad un método de categoría. –

8

No está definido. Depende de qué categoría se cargue primero por el tiempo de ejecución, si no hay un orden documentado en el que eso suceda.

Conclusión: no hagas esto. :)

Cuestiones relacionadas