El +initialize
est appelée automatiquement la première fois qu'une classe est utilisée, avant que les méthodes de la classe ne soient utilisées ou que des instances ne soient créées. Vous ne devez jamais appeler +initialize
vous-même.
Je voulais aussi vous faire part d'une information que j'ai apprise et qui peut vous coûter cher : +initialize
est héritée par les sous-classes, et est également appelée pour chaque sous-classe qui n'implémente pas une fonction +initialize
de leur propre . Cela peut s'avérer particulièrement problématique si vous implémentez naïvement l'initialisation des singletons dans le module +initialize
. La solution consiste à vérifier le type de la variable de classe comme suit :
+ (void) initialize {
if (self == [MyParentClass class]) {
// Once-only initializion
}
// Initialization for this class and any subclasses
}
Toutes les classes qui descendent de NSObject ont à la fois +class
y -class
qui renvoient les Class
objet. Puisqu'il n'y a qu'un seul objet Class pour chaque classe, nous voulons tester l'égalité avec l'objet ==
opérateur. Vous pouvez l'utiliser pour filtrer ce qui ne doit se produire qu'une seule fois, plutôt qu'une fois pour chaque classe distincte dans une hiérarchie (qui peut ne pas encore exister) sous une classe donnée.
Dans un autre ordre d'idées, il est intéressant de se renseigner sur les méthodes connexes suivantes, si ce n'est déjà fait :
Edit : Consultez ce billet de @bbum qui en explique davantage sur +initialize
: http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/
De plus, Mike Ash a écrit un article détaillé sur les questions-réponses du vendredi concernant la +initialize
y +load
méthodes : https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html