Ziel-C: init vs initialize

74

Was ist in Objective-C der Unterschied zwischen der initMethode (dh dem festgelegten Initialisierer für eine Klasse) und der initializeMethode? Welcher Initialisierungscode sollte jeweils eingegeben werden?

jrdioko
quelle

Antworten:

126

-initist eine Instanzmethode, mit der ein bestimmtes Objekt initialisiert wird. +initializeist eine Klassenmethode, die ausgeführt wird, bevor Instanzen der Klasse erstellt werden und bevor andere Klassenmethoden ausgeführt werden. +initializewird nicht die meiste Zeit verwendet, aber es ist praktisch, um statische Variablen einzurichten, die die gesamte Klasse möglicherweise verwendet, oder um sicherzustellen, dass bestimmte Bedingungen erfüllt sind, bevor Instanzen erstellt werden.

Der Code, der zu einer -initMethode gehört, wird ausführlich im Abschnitt Implementieren eines Initialisierers der Programmiersprache Objective-C beschrieben . Es gibt auch einige Erläuterungen zum Initialisieren von Klassen (dh +initialize) und warum Sie dies möglicherweise im selben Dokument im Abschnitt Klassenobjekte tun müssen . Der Code, der verwendet +initializewird, ist im Allgemeinen stark an die spezielle Funktionalität der Klasse gebunden, für die Sie ihn zunächst initialisieren müssen. Eine wichtige Sache, die Sie beachten sollten +initialize(und in jeder Klassenmethode), ist, dass sich selfeine Klassenmethode auf die Klasse selbst bezieht, nicht auf eine Instanz der Klasse.

Caleb
quelle
12
"Ausführen, bevor Instanzen der Klasse erstellt werden" nicht wirklich: Wird gesendet, bevor diese Klasse ihre erste Nachricht empfängt (mit Ausnahme der +initializeMethode). Sie können tatsächlich eine Instanz einer Klasse erstellen, ohne dieser Klasse eine Nachricht zu senden (mit der IMPMethode create-instance (normalerweise +allocWithZone:kann dies jedoch variieren)).
11
@WTP, fairer Punkt, aber wenn Sie in diesem Bereich arbeiten, ist Ihnen die Unterscheidung zwischen + initialize und -init wahrscheinlich schon ziemlich klar.
Caleb
4
Normalerweise sehe ich eine if (self == [NameOfClass class])Insider- +initializeMethode. Warum müssen wir das überprüfen? Ich weiß, dass es etwas damit zu tun hat, dass die +initializeMethode zweimal für die Elternklasse aufgerufen wird, aber es ist mir nicht klar. Jede Hilfe geschätzt!
Makaed
3
@makaed Ihre Frage wird in den Dokumenten gut beantwortet - hier ist die relevante Zeile: Die Implementierung der Oberklasse kann mehrmals aufgerufen werden, wenn die Unterklassen keine Initialisierung implementieren - die Laufzeit ruft die geerbte Implementierung auf ... Also, obwohl +initializesie nur einmal aufgerufen wird Pro Klasse kann eine einzelne Implementierung mehrmals aufgerufen werden - einmal für die Klasse, in der sie sich befindet, und einmal für jede Unterklasse, die keine eigene +initializeMethode bereitstellt .
Caleb
1
Ah danke! Das macht jetzt Sinn. Ich habe auch eine Frage erstellt und hatte einige gute Antworten.
Makaed
18

Um eine Parallele für Java-Entwickler zu ziehen, ist init wie ein Konstruktor, während initialize wie ein statischer Block für eine Klasse ist.

Eki
quelle
3
Tolle Erklärung! Danke vielmals!
Sakthimuthiah