¿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 clases existentes. ¿Alguien puede arrojar luz sobre esto? Se agradecerá mucho la ejemplificación con código.
¿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 clases existentes. ¿Alguien puede arrojar luz sobre esto? Se agradecerá mucho la ejemplificación con código.
Respuestas:
Una categoría es una forma de agregar métodos a 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, excepto por 2 diferencias principales:
La categoría no tiene nombre. Se declara así:
@interface SomeClass ()
- (void) anAdditionalMethod;
@fin
La implementación de la extensión debe estar en el bloque principal @implementation del archivo.
Es bastante común ver una extensión de clase en la parte superior de un archivo .m que declara más métodos en la clase, que luego se implementan a continuación en la sección principal de @implementation 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).
=> En Objective C, cuando desee agregar más funcionalidad a una clase sin herencia, simplemente use la categoría para ello.
=> Viene con su propia .h y .m archivo
=> se Category
usa para agregar un nuevo método, no propiedades.
-> In Objective C, when you want to make behaviour of some property private you use class extension.
-> it comes with **.h** file only.
-> mainly for properties.
Nota: cuando agregamos un nuevo archivo y seleccionamos una opción del objetivo c, la categoría muestra categoría y "categoría en" no "subclase de", por lo que se muestra como
@interface className (categoryName)
@end
-Usted conseguir dos archivos .h y .m con el nombre de archivo como ( className + categoryName.h y className + categoryName.m )
y en caso de extensión obtendrá
@interface className()
@end
-Obtendrá solo un archivo con el nombre className_extensionName.h
La categoría es una forma de agregar métodos a una clase, ya sea que el código fuente esté disponible o no, lo que significa que puede agregar una categoría a las clases básicas 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.
Podemos agregar variables de instancia y propiedades adicionales en la extensión de la clase pero no en la categoría.
Cualquier variable y método dentro de la extensión ni siquiera es accesible para las clases heredadas.
La categoría y la extensión están diseñadas básicamente para manejar una base de código grande, pero la categoría es una forma de extender la API de clase en varios archivos de origen, mientras que la extensión es una forma de agregar métodos requeridos fuera del archivo de interfaz principal.
Use la categoría cuando tenga que dividir el mismo código de clase en diferentes archivos fuente de acuerdo con diferentes funcionalidades, y la extensión cuando solo necesite agregar algunos métodos requeridos a la clase existente fuera del archivo de interfaz principal. Además, cuando necesite modificar una variable de instancia declarada públicamente en una clase, por ejemplo, readonly para readwrite, puede volver a declararla en extensión.
Extensión : Hacer que los métodos sean privados y agregar propiedades de nuestra propia clase personalizada, no de la clase Apple.
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 NSString
.
También podemos tener propiedades usando establecer propiedad asociada 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/
@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 para NSMutableArray por Apple
extensión ios similar a c #, clase abstracta de java o
categoría ios de interfaz
similar a c #, extensión de clase java
Categorías
Las categorías se utilizan cuando se crea un archivo que contiene una gran cantidad de métodos, por lo que le brindan la posibilidad de dividir una sola clase en diferentes módulos. Además, si se realizan cambios en las categorías, el compilador no pierde el tiempo para compilar todo el proyecto. Las categorías no pueden agregar nuevas variables o propiedades y buscar su clase principal. Puede anular un método en una categoría, pero no es una buena idea porque el método no se puede anular más. Además, el flujo se puede realizar porque todas las categorías tienen el mismo nivel jerárquico y, por lo tanto, pueden existir dos categorías que pertenecen a la misma clase principal en tiempo de ejecución. También se pueden crear métodos protegidos usando categorías
Extensiones
Las extensiones le permiten anular la propiedad o agregar una nueva propiedad a la clase principal existente. Sintéticamente igual a las categorías que no tienen nombre y se representan como @interface class () No hay archivo .m presente y el método declarado en extensión debe implementarse en @implementación del archivo principal
Más ayuda en este enlace
Aquí está mi entendimiento:
Las extensiones se utilizan generalmente para agregar funciones adicionales a nuestra propia " clase personalizada ". Podemos agregar métodos privados o propiedades ampliando la interfaz de la clase que se puede utilizar dentro de 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 adicionales a clases preexistentes. Por ejemplo, podemos crear nuestros propios métodos ampliando 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 debe darle un nombre dentro de los corchetes. Pero para la extensión no se requiere ningún nombre. De ahí que algunas veces también se denominen categorías anónimas.