ultima tutorial objective example objective-c

objective-c - tutorial - objective c vs c++



Diferencia entre categoría y extensión de clase (9)

  1. La categoría es una forma de agregar métodos a una clase, ya sea que el código fuente esté o no disponible implica que puede agregar categoría a las clases de base como NSString y también a sus propias clases personalizadas.

La extensión solo se puede agregar a las clases cuyo código fuente esté disponible porque el compilador compila el código fuente y la extensión al mismo tiempo.

  1. Podemos agregar variables de instancia adicionales y propiedades en la extensión de clase, pero no en Categoría.

  2. Cualquier variable y método dentro de la extensión ni siquiera es accesible para la clase heredada.

  3. La categoría y la extensión están hechas básicamente para manejar una gran base de código, pero la categoría es una forma de extender la API de clase en múltiples archivos fuente, mientras que la extensión es una forma de agregar los métodos necesarios al lado del archivo de interfaz principal.

  4. Use la categoría cuando tenga que dividir su mismo código de clase en un archivo fuente diferente de acuerdo con las diferentes funcionalidades y extensiones cuando solo necesite agregar algunos métodos necesarios a la clase existente fuera del archivo de interfaz principal. también cuando necesite modificar una variable de instancia públicamente declarada en una clase. por ejemplo: readonly to readwrite puede volver a declararlo en extensión.

Cuál es la diferencia entre una categoría y una extensión de clase. Creo que ambos se usan para agregar métodos personalizados en las clases existentes. ¿Alguien puede arrojar luz sobre esto? La ejemplificación con código será realmente apreciada.


  1. categoría

    -> En el objetivo c, cuando desee agregar más funcionalidades a una clase sin herencia, simplemente use la categoría correspondiente.

    -> viene con su propio archivo .h y .m

    -> Categoría use para agregar un nuevo método, no propiedades.

  2. extensión de clase

    -> En el objetivo c, cuando quiere que el comportamiento de una propiedad sea privado, usa la extensión de clase.

    -> viene con el archivo .m solamente.

    -> principalmente para propiedades.

nota: cuando agregamos un nuevo archivo y seleccionamos una opción de categoría c objetivo, se muestra categoría y "categoría en" no "subclase de" para que se muestre como

@interface className (categoryName) @end

-obtiene dos archivos .h y .m con el nombre de archivo como (className + categoryName.h y className + categoryName.m)

y en caso de extensión obtienes

@interface className() @end

-obtiene un solo archivo con nombre como className_extensionName.h

  • En la categoría no eres propietario de la clase, pero sí en extensión.

Aquí está mi entendimiento:

Las extensiones se usan generalmente para agregar características adicionales a nuestra propia " clase personalizada ". Podemos agregar métodos privados o propiedades que amplíen la interfaz de clase que se puede usar en la implementación de la clase.

Las extensiones deben escribirse dentro del mismo archivo que la clase. Por lo tanto, no puede escribir extensiones para tipos predefinidos como String, Float, etc.

Por otro lado, las categorías se pueden usar para agregar métodos extra a las clases preexistentes. Ejemplo podemos crear nuestros propios métodos extendiendo la clase String. Tenga en cuenta que no podemos crear propiedades adicionales en las categorías. También la principal ventaja de las categorías es que podemos escribir las categorías en cualquier otro archivo, fuera del archivo donde sale su clase.

Además, al crear categorías, se supone que debes ponerle un nombre entre corchetes. Pero para la extensión no se requiere nombre. De ahí que a veces también se les llame categorías anónimas.


Categorías

Las categorías se utilizan cuando se crea un archivo que contiene una gran cantidad de métodos. Por lo tanto, le brindan la posibilidad de dividir una clase en módulos diferentes. Además, si se realizan cambios en las categorías, el compilador no pierde tiempo para compilar todo el proyecto. .Las categorías no pueden agregar nuevas variables o propiedades y buscar hasta su clase principal. Puede anular un método en una categoría, pero no es una buena idea porque el método no puede anularse más. También se puede efectuar el flujo porque todas las categorías tienen el mismo nivel jerárquico y, por lo tanto, dos categorías que pertenecen a la misma clase principal pueden existir en tiempo de ejecución. También se pueden crear métodos protegidos utilizando categorías

Extensiones

Las extensiones le permiten anular la propiedad o agregar nueva propiedad a la clase padre existente. Sintéticamente lo mismo para las categorías que no tienen nombre y están representadas como @interface class () No hay archivo .m presente y el método declarado en extensión debe implementarse en @implementation del archivo principal

Más ayuda en code.tutsplus.com/tutorials/… enlace


También podemos tener propiedades usando el conjunto de propiedades asociadas en la clase de categoría.

@interface SomeClass (Private) @property (nonatomic, assign) id newProperty; @end NSString * const kNewPropertyKey = @"kNewPropertyKey"; @implementation SomeClass (Private) @dynamic newProperty; - (void)setNewProperty:(id)aObject { objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN); } - (id)newProperty { return objc_getAssociatedObject(self, kNewPropertyKey); } @end

Consulte: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/


Una categoría es una forma de agregar métodos a las clases existentes. Por lo general, residen en archivos llamados "Class + CategoryName.h", como "NSView + CustomAdditions.h" (y .m, por supuesto).

Una extensión de clase es una categoría, a excepción de 2 diferencias principales:

  1. La categoría no tiene nombre. Se declara así:

    @interface SomeClass ()

    - (void) anAdditionalMethod; @fin

  2. La implementación de la extensión debe estar en el bloque @implementation principal del archivo.

Es bastante común ver una extensión de clase en la parte superior de un archivo .m declarando más métodos en la clase, que luego se implementan a continuación en la sección @implementation principal de la clase. Esta es una forma de declarar métodos "pseudo-privados" (pseudo-privados) en el sentido de que no son realmente privados, simplemente no están expuestos externamente.


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


Extensión : hacer que los métodos sean privados y agregar propiedades de nuestra clase personalizada no de clase de manzana

Categoría : - Para agregar más métodos en la clase existente, no en la propiedad, se puede usar tanto para la clase personalizada como para la clase apple, como NSString.


@interface SomeClass () - (void) anAdditionalMethod; @end

Creo que no es la forma de declarar Categoría. La categoría debe tener un nombre

@interface SomeClass (XYZ) - (void) anAdditionalMethod; @end

por ejemplo

@interface NSMutableArray (NSMutableArrayCreation) + (id)arrayWithCapacity:(NSUInteger)numItems; - (id)initWithCapacity:(NSUInteger)numItems; @end

Declarado por NSMutableArray por Apple