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
"if ([Selbst Klasse] == [MyParentClass Klasse])" '[Selbst Klasse]' ist hier redundant. Sie können einfach sagen "if (self == [MyParentClass class])' – user102008
Vielen Dank! Ihr Tidbit beantwortete meine Frage, warum ein bestimmter statischer Initialisierer zweimal aufgerufen wurde. –