Ausgabe
Ich bin neu in Objective C und konnte nicht herausfinden, ob es das Äquivalent eines statischen Konstruktors in der Sprache gibt, dh eine statische Methode in einer Klasse, die automatisch vor der ersten Instanz einer solchen Klasse aufgerufen wird wird instanziiert. Oder muss ich den Initialisierungscode selbst aufrufen?
Vielen Dank
Lösung
Die +initialize
Methode wird automatisch aufgerufen, wenn eine Klasse zum ersten Mal verwendet wird, bevor Klassenmethoden verwendet oder Instanzen erstellt werden. Du solltest dich niemals selbst anrufen +initialize
.
Ich wollte auch einen Leckerbissen weitergeben, den ich gelernt habe und der Sie auf der Straße beißen kann: +initialize
wird von Unterklassen geerbt und wird auch für jede Unterklasse aufgerufen, die keine +initialize
eigene implementiert . Dies kann besonders problematisch sein, wenn Sie die Singleton-Initialisierung in naiv implementieren +initialize
. Die Lösung besteht darin, den Typ der Klassenvariablen wie folgt zu überprüfen:
+ (void) initialize {
if (self == [MyParentClass class]) {
// Once-only initializion
}
// Initialization for this class and any subclasses
}
Alle Klassen, die von NSObject abstammen, haben sowohl +class
als auch -class
Methoden, die das Class
Objekt zurückgeben. Da es für jede Klasse nur ein Klassenobjekt gibt, wollen wir die Gleichheit mit dem ==
Operator testen. Sie können dies verwenden, um zu filtern, was nur einmal passieren soll, im Gegensatz zu einmal für jede einzelne Klasse in einer Hierarchie (die möglicherweise noch nicht existiert) unterhalb einer bestimmten Klasse.
Bei einem nebensächlichen Thema lohnt es sich, sich mit den folgenden verwandten Methoden vertraut zu machen, falls Sie dies noch nicht getan haben:
- – isMemberOfClass:(Class)aClass (nur für
aClass
sich selbst wahr) - – isKindOfClass:(Class)aClass (true für
aClass
und Kinder) - + isSubclassOfClass:(Class)aClass (wie oben, aber eine Klassenmethode)
Bearbeiten: Schauen Sie sich diesen Beitrag von @bbum an , der mehr über Folgendes erklärt +initialize
: https://web.archive.org/web/20201108095221/http://www.friday.com/bbum/2009/09/06/iniailize-can- mehrfach-ausgeführt-werden-nicht-so-viel-laden/
Außerdem hat Mike Ash ein schönes, detailliertes Freitags-Q&A über die Methoden
+initialize
und geschrieben: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html+load
Beantwortet von – Quinn Taylor
Antwort geprüft von – Robin (FixError Admin)