2009-06-14 14 views
69

Ich bin neu in Objective C und ich konnte nicht herausfinden, ob es das Äquivalent eines statischen Konstruktors in der Sprache gibt, das ist eine statische Methode in einer Klasse, die automatisch vor der ersten Instanz aufgerufen wird Diese Klasse wird instanziiert. Oder muss ich den Initialisierungscode selbst aufrufen?Statisches Konstruktoräquivalent in Objective-C?

Dank

Antwort

121

Die Methode +initialize heißt automatisch das erste Mal eine Klasse verwendet wird, bevor Klassenmethoden verwendet werden oder Instanzen erstellt werden. Sie sollten niemals +initialize selbst anrufen.

Ich wollte auch erfuhr ich, dass kann man entlang einer tidbit passieren beißen die Straße hinunter: +initialize von Unterklassen vererbt wird, und auch für jede Unterklassen aufgerufen wird, die nicht eine +initialize ihrer eigenen nicht implementiert. Dies kann besonders problematisch sein, wenn Sie die Singleton-Initialisierung in +initialize naiv implementieren. Die Lösung ist, die Art der Klassenvariable zu überprüfen, wie so:

+ (void) initialize { 
    if (self == [MyParentClass class]) { 
    // Once-only initializion 
    } 
    // Initialization for this class and any subclasses 
} 

Alle Klassen, die von NSObject Abstieg haben beide +class und -class Methoden, die das Class Objekt zurückgeben. Da für jede Klasse nur ein Klassenobjekt existiert, wollen wir die Gleichheit mit dem Operator == testen. Sie können dies verwenden, um zu filtern, was nur einmal vorkommen soll, und einmal für jede einzelne Klasse in einer Hierarchie (die möglicherweise noch nicht existiert) unterhalb einer bestimmten Klasse.

Auf einem tangentialen Thema, es lohnt sich über die folgenden verwandten Methoden zu lernen, wenn Sie nicht bereits haben:


Edit: Schauen Sie sich diesen Beitrag von @bbum, die mehr über +initialize erklärt: http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/

Auch Mike Ash schrieb einen schönen detaillierten Freitag Q & A über die +initialize und +load Methoden: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html

+5

"if ([Selbst Klasse] == [MyParentClass Klasse])" '[Selbst Klasse]' ist hier redundant. Sie können einfach sagen "if (self == [MyParentClass class])' – user102008

+1

Vielen Dank! Ihr Tidbit beantwortete meine Frage, warum ein bestimmter statischer Initialisierer zweimal aufgerufen wurde. –

51

Dort wird die Methode +initialize Klasse, die vor einer Klasse aufgerufen wird, verwendet wird.

+0

Danke, das ist genau das, was ich suchte, aber ich habe Suche nach „static init“, „statische Initialisierung“, etc. und fand es nicht. –

+8

In fast allen Fällen, wo Sie in Java "statisch" sagen würden, sagen Sie in Objective-C "Klasse". – Chuck

10

Ein bisschen ein Addendum zu diesem Thema:

Es gibt eine andere Möglichkeit, einen 'statischen Konstruktor' i zu erstellen n obj-c unter Verwendung einer __attribute Richtlinie:

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

+ laden wird das gleiche tun und sieht mehr in Einklang mit dem Objective-C-Paradigma –

+0

@Grady Nein, ich listet speziell eine Situation in der Post, wo + laden ist nicht gleichwertig. –

+0

+ initialize wäre anders, aber + load sollte gleich sein, oder? –

Verwandte Themen