ios objective-c category

ios - Anular un método en Objective c vía categoría



objective-c category (3)

La mensajería de Objective-C es dinámica, esto significa que no importa si importa o no la categoría. El objeto recibirá el mensaje y ejecutará ese método.

La categoría está anulando tu método. Esto significa que cuando el tiempo de ejecución envía un mensaje a ese objeto, siempre encontrará el método anulado, sin importar lo que importe.

Si desea ignorar una categoría, no debe compilarla, por lo que puede eliminar la categoría de las fuentes del compilador.
Una alternativa es la subclasificación.

También lea esto:

Evitar Categoría Método Nombre Choques

Debido a que los métodos declarados en una categoría se agregan a una clase existente, debe tener mucho cuidado con los nombres de los métodos.

Si el nombre de un método declarado en una categoría es el mismo que un método en la clase original, o un método en otra categoría en la misma clase (o incluso una superclase), el comportamiento no está definido en cuanto a qué método de implementación se usa en tiempo de ejecución Es menos probable que esto sea un problema si usa categorías con sus propias clases, pero puede causar problemas al usar categorías para agregar métodos a las clases estándar de Cocoa o Cocoa Touch.

Entonces, en su caso, no tiene ningún problema porque, como se dijo, es menos probable que ocurra con clases definidas por el usuario. Pero definitivamente debes usar subclases en lugar de escribir una categoría .

Lo siguiente está trabajando en el objetivo c:

// Base Class in ClassA.h and ClassA.m @interface ClassA : NSObject - (NSString *) myMethod; @end @implementation ClassA - (NSString*) myMethod { return @"A"; } @end //Category in ClassA+CategoryB.h and ClassA+CategoryB.m @interface ClassA (CategoryB) - (NSString *) myMethod; @end @implementation ClassA (CategoryB) - (NSString*) myMethod { return @"B"; } @end

La pregunta es, si solo estoy importando ClassA.hy enviando el mensaje

[myClassA myMethod]; //returns B

¿Por qué está volviendo B ? No estoy importando ClassA + CategoryB

Incluso más adelante, si hiciera lo siguiente:

// Base Class in ClassA.h and ClassA.m @interface ClassA : NSObject - (NSString *) myMethod; - (NSString *) mySecondMethod; @end @implementation ClassA - (NSString*) myMethod { return @"A"; } - (NSString *) mySecondMethod { return [self myMethod]; } @end //Category in ClassA+CategoryB.h and ClassA+CategoryB.m @interface ClassA (CategoryB) - (NSString *) myMethod; @end @implementation ClassA (CategoryB) - (NSString*) myMethod { return @"B"; } @end

y llame a mySecondMethod:

ClassA *a = [[ClassA alloc] init]; NSLog(@"%@",[a myMethod]);

¿El resultado seguirá siendo B aunque nadie sabe (debido a que no hay importación) de la implementación de la categoría?

Yo exceptué, solo para devolver B si estaba importando la categoría ...

Así que cualquier consejo apreciado.


Obj-C le permite agregar métodos a una clase existente usando Categorías. Entonces, si agrega un método a NSString, el método de categorías está disponible para NSMutableString y todas las clases que heredan NSString o cualquier subclase de NSString.

Pero debes evitar anular la categoría.

No estará 100% seguro de qué método se llamará. Depende del compilador.

De la documentación de Apple.

Aunque el lenguaje de Objective-C actualmente le permite usar una categoría para anular los métodos que hereda la clase, o incluso los métodos declarados en la interfaz de la clase, no se recomienda que lo haga. Una categoría no es un sustituto de una subclase. El uso de una categoría para anular métodos tiene varios inconvenientes importantes: cuando una categoría anula un método heredado, el método en la categoría puede, como es habitual, invocar la implementación heredada mediante un mensaje a super. Sin embargo, si una categoría anula un método que existe en la clase de la categoría, no hay forma de invocar la implementación original. Una categoría no puede anular de manera confiable los métodos declarados en otra categoría de la misma clase. Este problema es de particular importancia porque muchas de las clases de Cocoa se implementan utilizando categorías. Un método definido por el marco que intenta invalidar puede haberse implementado en una categoría, por lo que la implementación no tiene prioridad. La presencia misma de algunos métodos de categoría puede causar cambios de comportamiento en todos los marcos. Por ejemplo, si reemplaza el método windowWillClose: delegate en una categoría en NSObject, todos los delegados de ventana en su programa responderán utilizando el método de categoría; El comportamiento de todas sus instancias de NSWindow puede cambiar. Las categorías que agregue en una clase de marco pueden causar cambios misteriosos en el comportamiento y provocar bloqueos.


Usted incluyó implícitamente el código definido en la categoría al compilarlo.

Si desea evitar que se ejecute el código de categoría, debe eliminarlo de su destino, eliminando el archivo de implementación de la categoría. Puedes hacerlo desde

Target-> Build Phase-> Compile Sources

Dicho esto, nunca debes usar una categoría para anular un método. Esa es una muy mala práctica y no es para qué sirven las categorías.