tutorial objective español objective-c objective-c-category class-extensions

objective-c - objective - sparql tutorial español



Extensión de clase vs categoría de clase (5)

Las extensiones de clase @interface Class () son mucho más potentes y pueden insertar variables en la clase. Las categorías @interface Class (Category) no pueden.

¿Qué otras diferencias existen y cuándo se debe usar una categoría sobre una extensión de clase?


La diferencia principal es que con una extensión, el compilador esperará que implemente los métodos dentro de su implementación @implementation principal, mientras que con una categoría tiene un bloque @implementation separado. Por lo tanto, debería usar una extensión en la parte superior de su archivo .m principal (el único lugar en el que debería preocuparse por los ivars, por cierto), sino que debe ser solo eso, una extensión .


Las categorías son una característica del lenguaje Objective-C que le permite agregar nuevos métodos a una clase existente. Las extensiones son un caso especial de categorías que le permiten definir métodos que deben implementarse en el bloque de implementación principal.

Las declaraciones privadas pueden estar en extensiones de clase, que son principalmente algunas propiedades, porque no tenemos necesidad de declarar un método antes de llamarlo.


Las categorías son una forma de ampliar la API de las clases existentes, y las extensiones son una forma de agregar los métodos necesarios a la API fuera del archivo de interfaz principal. Ambos fueron diseñados inicialmente para aliviar la carga de mantener grandes bases de código.

Advertencias de uso Categoría:

1- No puede anular de manera confiable los métodos definidos en categorías para la misma clase.

2- Una categoría no puede agregar variables de instancia. Esto significa que no puede declarar nuevas propiedades.

Referencia: Objective-C sucintamente: categorías y extensiones . Tiene una discusión detallada con ejemplos.


Una extensión de clase tiene cierta similitud con una categoría, pero solo se puede agregar a una clase para la que tiene el código fuente en tiempo de compilación (la clase se compila al mismo tiempo que la extensión de clase). Los métodos declarados por una extensión de clase se implementan en el bloque @implementation para la clase original, por lo que no puede, por ejemplo, declarar una extensión de clase en una clase de infraestructura, como una clase Cocoa o Cocoa Touch como NSString.

La sintaxis para declarar una extensión de clase es similar a la sintaxis de una categoría, y se ve así:

@interface ClassName () @end

Como no se da ningún nombre entre paréntesis, las extensiones de clase a menudo se denominan categorías anónimas.

A diferencia de las categorías normales, una extensión de clase puede agregar sus propias propiedades y variables de instancia a una clase. Si declaras una propiedad en una extensión de clase, así:

@interface XYZAnimal () { id _someCustomInstanceVariable; } ... @end

En mi humilde opinión, es mejor pensar en las extensiones de clase como una interfaz privada para una clase. La interfaz principal (en su archivo .h) actúa como la interfaz pública que define el contrato de comportamiento de la clase con otras clases.

Use extensiones de clase para ocultar información privada

Las extensiones de clase a menudo se utilizan para ampliar la interfaz pública con métodos privados adicionales o propiedades para usar dentro de la implementación de la clase en sí. Es común, por ejemplo, definir una propiedad como readonly en la interfaz, pero como readwrite en una extensión de clase declarada arriba de la implementación, para que los métodos internos de la clase puedan cambiar el valor de la propiedad directamente.

Como ejemplo, la clase XYZPerson podría agregar una propiedad llamada uniqueIdentifier, diseñada para realizar un seguimiento de la información, como un número de seguridad social en los EE. UU.

Por lo general, requiere una gran cantidad de documentación para tener un identificador único asignado a un individuo en el mundo real, por lo que la interfaz de clase XYZPerson puede declarar esta propiedad como de solo lectura y proporcionar algún método que solicite que se le asigne un identificador, como este:

@interface XYZPerson : NSObject ... @property (readonly) NSString *uniqueIdentifier; - (void)assignUniqueIdentifier; @end

Para que la clase XYZPerson pueda cambiar la propiedad internamente, tiene sentido volver a declarar la propiedad en una extensión de clase definida en la parte superior del archivo de implementación para la clase:

@property (readwrite) NSString *uniqueIdentifier;

Nota: El atributo readwrite es opcional, porque es el predeterminado. Es posible que desee utilizarlo al redeclar una propiedad, para mayor claridad.


extensión ios similar a c #, clase o interfaz abstracta java
categoría ios similar a la extensión de la clase c #