El método +initialize
se llama automáticamente la primera vez que se utiliza una clase, antes de que se usen los métodos de clase o se creen instancias. Nunca debe llamar al +initialize
usted mismo.
También quería pasar a lo largo de un bocado supe que pueden morder por el camino: +initialize
se hereda por las subclases, y también se llama para cada subclases que no implementa un +initialize
de su propia. Esto puede ser especialmente problemático si implementa ingenuamente la inicialización de singleton en +initialize
. La solución es comprobar el tipo de la variable de clase, así:
+ (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 +class
y -class
métodos 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 acerca de los siguientes métodos relacionados, si no lo ha hecho:
Editar: Control hacia fuera este mensaje por @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 buen detallada Viernes Q & A sobre los +initialize
y +load
métodos: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
"if ([self class] == [Clase MyParentClass])" '[self class]' es redundante aquí. usted puede decir 'if (self == [MyParentClass class])' – user102008
¡Gracias! Tu tidbit respondió mi pregunta de por qué un inicializador estático en particular se invocaba dos veces. –