web-dev-qa-db-fra.com

Constructeur statique équivalent en Objective-C?

Je suis nouveau sur Objective C et je n'ai pas pu savoir s'il y a l'équivalent d'un constructeur statique dans le langage, c'est une méthode statique dans une classe qui sera automatiquement appelée avant la première instance de cette classe est instancié. Ou dois-je appeler le code d'initialisation moi-même?

Merci

70
Franklin Munoz

Le +initialize la méthode est appelée automatiquement la première fois qu'une classe est utilisée, avant d'utiliser des méthodes de classe ou de créer des instances. Vous ne devez jamais appeler +initialize toi même.

Je voulais aussi passer une friandise que j'ai appris qui peut vous mordre sur la route: +initialize est hérité par les sous-classes et est également appelé pour chaque sous-classe qui n'implémente pas de +initialize propre . Cela peut être particulièrement problématique si vous implémentez naïvement l'initialisation singleton dans +initialize. La solution est de vérifier le type de la variable de classe comme ceci:

+ (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 et -class méthodes qui renvoient l'objet Class. Puisqu'il n'y a qu'un seul objet Class pour chaque classe, nous voulons tester l'égalité avec le == opérateur. Vous pouvez l'utiliser pour filtrer ce qui ne doit se produire qu'une seule fois, par rapport à une fois pour chaque classe distincte dans une hiérarchie (qui peut ne pas encore exister) sous une classe donnée.

Sur un sujet tangentiel, il vaut la peine d'en apprendre davantage sur les méthodes connexes suivantes, si vous ne l'avez pas déjà fait:


Edit: Consultez cet article par @ bbum qui explique plus 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 joli Q&R détaillé vendredi sur le +initialize et +load méthodes: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html

128
Quinn Taylor

Il y a la méthode de classe + initialize qui sera appelée avant qu'une classe ne soit utilisée.

51
Nathan Kinsinger

Un petit addendum à ce sujet:

Il existe une autre façon de créer un 'constructeur statique' dans obj-c, en utilisant un __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.
}
10