Was ist in Objective-C der Unterschied zwischen der init
Methode (dh dem festgelegten Initialisierer für eine Klasse) und der initialize
Methode? Welcher Initialisierungscode sollte jeweils eingegeben werden?
Antworten:
-init
ist eine Instanzmethode, mit der ein bestimmtes Objekt initialisiert wird. +initialize
ist eine Klassenmethode, die ausgeführt wird, bevor Instanzen der Klasse erstellt werden und bevor andere Klassenmethoden ausgeführt werden. +initialize
wird 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 -init
Methode 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 +initialize
wird, 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 self
eine Klassenmethode auf die Klasse selbst bezieht, nicht auf eine Instanz der Klasse.
if (self == [NameOfClass class])
Insider- +initialize
Methode. Warum müssen wir das überprüfen? Ich weiß, dass es etwas damit zu tun hat, dass die +initialize
Methode zweimal für die Elternklasse aufgerufen wird, aber es ist mir nicht klar. Jede Hilfe geschätzt!
+initialize
sie 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 +initialize
Methode bereitstellt .
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.
+initialize
Methode). Sie können tatsächlich eine Instanz einer Klasse erstellen, ohne dieser Klasse eine Nachricht zu senden (mit derIMP
Methode create-instance (normalerweise+allocWithZone:
kann dies jedoch variieren)).