sistema programación programacion operativo objective lenguaje caracteristicas objective-c categories

objective c - programación - Reemplazar los métodos que usan categorías en Objective-C



swift lenguaje de programacion caracteristicas (4)

De la documentación de Apple :

Aunque el lenguaje Objective-C actualmente le permite usar una categoría para anular los métodos que la clase hereda, o incluso los métodos declarados en la interfaz de la clase, le recomendamos encarecidamente que no lo haga . Una categoría no es un sustituto de una subclase. Existen varias deficiencias importantes en el uso de una categoría para anular los métodos:

  • Cuando una categoría anula un método heredado, el método en la categoría puede, como de costumbre, invocar la implementación heredada a través de 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 intente anular puede haberse implementado en una categoría y, por lo tanto, qué implementación tiene prioridad no está definida.

  • La sola presencia de algunos métodos de categoría puede provocar cambios de comportamiento en todos los marcos. Por ejemplo, si anula la windowWillClose: delegue el método en una categoría en NSObject, todos los delegados de ventana en su programa responden usando el método de categoría; el comportamiento de todas sus instancias de NSWindow puede cambiar. Las categorías que agrega en una clase de infraestructura pueden causar cambios misteriosos en el comportamiento y provocar bloqueos.

¿Puedo usar una categoría de clase para anular un método que ya está implementado usando una categoría? Me gusta esto:

1) Método original

-(BOOL) method { return true; }

2) Método anulado

-(BOOL) method { NSLog(@"error?"); return true; }

¿Esto funcionará, o es esto ilegal?


El enlace de la documentación anterior está muerto; el mejor reemplazo que pude encontrar fue aquí: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… :

Evitar Categoría Nombre del método 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 igual 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é implementación de método 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 Cocoa o Cocoa Touch.

Es Apple usando un toque más ligero, pero el punto principal es el mismo: invita al desastre, porque el comportamiento impredecible es silencioso.


Es importante tener en cuenta que una categoría también se puede utilizar para anular los métodos existentes en la clase base (por ejemplo, el método de conducción de la clase Car), pero nunca debes hacer esto. El problema es que las categorías son una estructura organizacional plana. Si anula un método existente en Car + Maintenance.m, y luego decide que desea cambiar su comportamiento nuevamente con otra categoría, no hay forma de que Objective-C sepa qué implementación usar. Subclases es casi siempre una mejor opción en tal situación.

De este tutorial, http://rypress.com/tutorials/objective-c/categories