objective-c - ejemplos - awk unix
¿Constructor estático equivalente en Objective-C? (3)
Soy nuevo en Objective C y no he podido averiguar si hay el equivalente de un constructor estático en el lenguaje, que es un método estático en una clase que se llamará automáticamente antes de la primera instancia de dicha clase es instanciado. ¿O necesito llamar al código de inicialización yo mismo?
Gracias
Existe el método de clase +initialize que se llamará antes de que se use una clase.
Un poco de un apéndice a este tema:
Hay otra manera de crear un ''constructor estático'' en obj-c, usando una directiva __attribute
:
// prototype
void myStaticInitMethod(void);
__attribute__((constructor))
void myStaticInitMethod()
{
// code here will be called as soon as the binary is loaded into memory
// before any other code has a chance to call +initialize.
// useful for a situation where you have a struct that must be
// initialized before any calls are made to the class,
// as they would be used as parameters to the constructors.
// e.g.
myStructDef.myVariable1 = "some C string";
myStructDef.myFlag1 = TRUE;
// so when the user calls the code [MyClass createClassFromStruct:myStructDef],
// myStructDef is not junk values.
}
El método +initialize
se invoca automáticamente la primera vez que se usa una clase, antes de que se utilicen los métodos de clase o se creen instancias. Nunca debes llamar +initialize
ti mismo.
También quería transmitir un bocado que aprendí que puede morderte: +initialize
es heredado por subclases, y también se llama para cada subclase que no implementa una +initialize
propia . Esto puede ser especialmente problemático si ingenuamente implementa la inicialización de singleton en +initialize
. La solución es verificar el tipo de variable de clase de la siguiente manera:
+ (void) initialize {
if (self == [MyParentClass class]) {
// Once-only initializion
}
// Initialization for this class and any subclasses
}
Todas las clases que descienden de NSObject tienen ambos métodos de +class
y -class
que devuelven el objeto Class
. Como solo hay un objeto Class para cada clase, queremos probar la igualdad con el operador ==
. Puede usar esto para filtrar lo que debería suceder solo una vez, frente a una vez para cada clase distinta en una jerarquía (que aún no existe) debajo de una clase determinada.
En un tema tangencial, vale la pena aprender sobre los siguientes métodos relacionados, si aún no lo ha hecho:
- - isMemberOfClass: (Class) aClass (verdadero solo para
aClass
) - - isKindOfClass: (Clase) aClass (verdadero para una
aClass
y niños) - + isSubclassOfClass: (Class) aClass (igual que el anterior, pero un método de clase)
Editar: Echa un vistazo a esta publicación de @bbum que explica más sobre +initialize
: http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/
Además, Mike Ash escribió un bonito y detallado viernes Q & A sobre los métodos +initialize
y +load
: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html