70 votes

Constructeur statique équivalent en Objective-C ?

Je suis nouveau en Objective C et je n'ai pas réussi à trouver s'il existe l'équivalent d'un constructeur statique dans le langage, c'est-à-dire une méthode statique dans une classe qui sera automatiquement appelée avant que la première instance de cette classe soit instanciée. Ou dois-je appeler moi-même le code d'initialisation ?

Merci

129voto

Quinn Taylor Points 29688

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

51voto

Nathan Kinsinger Points 6202

Il y a le +initialiser méthode de classe qui sera appelée avant l'utilisation d'une classe.

10voto

Richard J. Ross III Points 33152

Un peu comme un addendum à ce sujet :

Il existe une autre façon de créer un "constructeur statique" dans obj-c, en utilisant une balise __attribute directive :

// 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.
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X