Constructeur statique équivalent en Objective-C?

Je suis nouveau sur l’Objective C et je n’ai pas pu savoir s’il y avait 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 la première instance de cette classe. est instancié. Ou dois-je appeler le code d’initialisation moi-même?

Merci

La méthode +initialize est appelée automatiquement la première fois qu’une classe est utilisée, avant que toute méthode de classe soit utilisée ou que des instances soient créées. Vous ne devriez jamais appeler +initialize vous-même.

Je voulais également transmettre une information que j’ai apprise qui peut vous mordre dans la route: +initialize est hérité par les sous-classes, et est également appelé pour chaque sous-classe qui n’implémente pas d’ +initialize . Cela peut être particulièrement problématique si vous implémentez naïvement l’initialisation singleton dans l’ +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 les méthodes +class et -class qui renvoient l’object Class . Comme il n’y a qu’un seul object Class pour chaque classe, nous voulons tester l’égalité avec l’opérateur == . Vous pouvez l’utiliser pour filtrer ce qui ne devrait arriver qu’une seule fois, par rapport à une fois pour chaque classe distincte d’une hiérarchie (qui n’existe peut-être pas encore) sous une classe donnée.

Sur un sujet tangentiel, il est utile de connaître les méthodes suivantes, si vous ne l’avez pas déjà fait:

  • – isMemberOfClass: (Class) aClass (true uniquement pour aClass lui-même)
  • – isKindOfClass: (Class) aClass (vrai pour aClass et les enfants)
  • + isSubclassOfClass: (Class) aClass (comme ci-dessus, mais une méthode de classe)

Edit: Découvrez ce post par @bbum qui explique plus à propos de +initialize : http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not- tellement de/

En outre, Mike Ash a écrit une belle interview du vendredi sur les méthodes d’ +initialize et de +load : https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and -initialization.html

Il y a la méthode de classe + initialize qui sera appelée avant l’utilisation d’une classe.

Un peu d’addenda à ce sujet:

Il existe un autre moyen de créer un “constructeur statique” dans obj-c, en utilisant une directive __atsortingbute :

 // prototype void myStaticInitMethod(void); __atsortingbute__((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. // eg myStructDef.myVariable1 = "some C ssortingng"; myStructDef.myFlag1 = TRUE; // so when the user calls the code [MyClass createClassFromStruct:myStructDef], // myStructDef is not junk values. }