Was ist der Unterschied zwischen einer Klassenmethode und einer Instanzmethode?
Sind Instanzmethoden die Accessoren (Getter und Setter), während Klassenmethoden so ziemlich alles andere sind?
objective-c
oop
methods
class-method
instance-methods
Hingebungsvoll
quelle
quelle
Alle technischen Details wurden in den anderen Antworten ausführlich behandelt. Ich möchte nur eine einfache Analogie teilen, die meiner Meinung nach den Unterschied zwischen einer Klasse und einer Instanz gut veranschaulicht:
Eine Klasse ist wie die Blaupause eines Hauses: Sie haben nur eine Blaupause und (normalerweise) können Sie mit der Blaupause allein nicht so viel anfangen.
Eine Instanz (oder ein Objekt ) ist das tatsächliche Haus , das Sie basierend auf der Blaupause bauen: Sie können viele Häuser aus derselben Blaupause bauen. Sie können dann die Wände in jedem der Häuser in einer anderen Farbe streichen, genauso wie Sie die Eigenschaften jeder Instanz einer Klasse unabhängig voneinander ändern können, ohne die anderen Instanzen zu beeinflussen.
quelle
difference between class method and an instance method
;Wie die anderen Antworten bereits sagten, arbeiten Instanzmethoden mit einem Objekt und haben Zugriff auf seine Instanzvariablen, während eine Klassenmethode mit einer Klasse als Ganzes arbeitet und keinen Zugriff auf die Variablen einer bestimmten Instanz hat (es sei denn, Sie übergeben die Instanz als Parameter).
Ein gutes Beispiel für eine Klassenmethode ist eine Zählermethode, die die Gesamtzahl der Instanzen einer Klasse zurückgibt. Klassenmethoden beginnen mit a
+
, während Instanzmethoden mit a beginnen-
. Zum Beispiel:main.m:
Ausgabe: Alter: 0 Anzahl der Personen: 2
Ein anderes Beispiel ist, wenn Sie eine Methode haben, die der Benutzer aufrufen kann, manchmal ist es gut, diese zu einer Klassenmethode zu machen. Wenn Sie beispielsweise eine Klasse namens MathFunctions haben, können Sie dies tun:
Dann würde der Benutzer anrufen:
ohne jemals die Klasse instanziieren zu müssen!
Sie können auch Klassenfunktionen verwenden, um automatisch freigegebene Objekte wie NSArrays zurückzugeben
Das nimmt ein Objekt, fügt es in ein Array ein und gibt eine automatisch freigegebene Version des Arrays zurück, die nicht speicherverwaltet werden muss, ideal für temperamentvolle Arrays und was nicht.
Ich hoffe du verstehst jetzt wann und / oder warum du Klassenmethoden anwenden solltest !!
quelle
Eine Instanzmethode gilt für eine Instanz der Klasse (dh ein Objekt), während eine Klassenmethode für die Klasse selbst gilt.
In C # ist eine Klassenmethode als statisch markiert. Methoden und Eigenschaften, die nicht als statisch markiert sind, sind Instanzmethoden.
quelle
Die Antwort auf Ihre Frage ist nicht spezifisch für Objective-C. In verschiedenen Sprachen können Klassenmethoden jedoch als statische Methoden bezeichnet werden.
Der Unterschied zwischen Klassenmethoden und Instanzmethoden ist
Klassenmethoden
Instanzmethoden
quelle
Ich denke, der beste Weg, dies zu verstehen, ist
alloc
undinit
. Es war diese Erklärung, die es mir ermöglichte, die Unterschiede zu verstehen.Klassenmethode
Eine Klassenmethode wird auf die gesamte Klasse angewendet. Wenn Sie die
alloc
Methode überprüfen , handelt es sich um eine Klassenmethode, die mit dem gekennzeichnet ist+
vor der Methodendeklaration angegeben ist. Es ist eine Klassenmethode, da sie auf die Klasse angewendet wird, um eine bestimmte Instanz dieser Klasse zu erstellen.Instanzmethode
Sie verwenden eine Instanzmethode, um eine bestimmte Instanz einer Klasse zu ändern, die für diese Instanz und nicht für die gesamte Klasse eindeutig ist.
init
Beispiel (mit einem-
vor der Methodendeklaration gekennzeichnet) ist eine Instanzmethode, da Sie normalerweise die Eigenschaften dieser Klasse ändern, nachdem sie mit erstellt wurdealloc
.Beispiel
Sie rufen die Klassenmethode
alloc
auf, um eine Instanz dieser Klasse zu generieren. Beachten Sie, dass der Empfänger der Nachricht eine Klasse ist.Sie ändern die
NSString
aufgerufene Instanz ,myString
indem Sie einige Eigenschaften für diese Instanz festlegen. Beachten Sie, dass der Empfänger der Nachricht eine Instanz (Objekt der KlasseNSString
) ist.quelle
alloc
Weist dem Objekt genügend Speicher zu,init
ändert den Inhalt dieser Speicheradressen, um den Status des Objekts zu definieren. Wir können ein Objekt nur ändern, wenn ein Leerzeichen vorhanden ist, in dem es geändert werden kann. Daher verwenden wir esalloc
für die Klasse, die entscheidet, dass wir dieses Leerzeichen erhalten.Klassenmethoden werden normalerweise verwendet, um Instanzen dieser Klasse zu erstellen
Gibt beispielsweise
[NSString stringWithFormat:@"SomeParameter"];
eineNSString
Instanz mit dem Parameter zurück, der an sie gesendet wird. Da es sich um eine Klassenmethode handelt, die ein Objekt seines Typs zurückgibt, wird sie auch als Convenience-Methode bezeichnet.quelle
Also wenn ich es richtig verstehe.
Für eine
class
Methode müssen Sie keine Instanz dieses Objekts zuweisen, um es zu verwenden / zu verarbeiten. Eineclass
Methode ist in sich geschlossen und kann ohne Abhängigkeit vom Zustand eines Objekts dieser Klasse betrieben werden. EINclass
Methode wird erwartet, dass sie Speicher für ihre gesamte eigene Arbeit zuweist und die Zuordnung aufhebt, wenn dies erledigt ist, da keine Instanz dieser Klasse Speicher freigeben kann, der in früheren Aufrufen der Klassenmethode zugewiesen wurde.EIN
instance
Methode ist genau das Gegenteil. Sie können es nur aufrufen, wenn Sie eine Instanz dieser Klasse zuweisen. Es ist wie eine normale Klasse, die einen Konstruktor hat und einen Destruktor haben kann (der den gesamten zugewiesenen Speicher bereinigt).Höchstwahrscheinlich (es sei denn, Sie schreiben eine wiederverwendbare Bibliothek, sollten Sie keine
class
Variable benötigen .quelle
Instanzmethoden arbeiten mit Instanzen von Klassen (dh "Objekten"). Klassenmethoden sind Klassen zugeordnet (die meisten Sprachen verwenden das Schlüsselwort
static
für diese Typen).quelle
Nehmen wir zum Beispiel ein Spiel, in dem viele Autos erscheinen. Jedes gehört zur Klasse CCar. Wenn ein Auto instanziiert wird, ruft es an
So kann die CCar-Klasse eine Liste aller instanziierten CCar erstellen. Angenommen, der Benutzer beendet ein Level und möchte alle Autos entfernen. Sie können entweder: 1- eine Liste aller manuell erstellten CCar durchgehen und dies tun
whicheverCar.remove();
oder 2- CCar eine removeAllCars-Methode hinzufügen, die dies erledigt für Sie, wenn Sie [CCar removeAllCars] aufrufen. DhallCars[n].remove();
Sie können dem Benutzer beispielsweise erlauben, eine Standardschriftgröße für die gesamte App anzugeben, die beim Start geladen und gespeichert wird. Ohne die Klassenmethode müssen Sie möglicherweise so etwas tun
Mit der Klassenmethode könnten Sie durchkommen
[FontHandler getDefaultFontSize]
.Bei Ihrer Funktion removeVowels werden Sprachen wie C # mit bestimmten Methoden wie toLower oder toUpper tatsächlich beides haben.
zB
myString.removeVowels()
undString.removeVowels(myString)
(in ObjC wäre das[String removeVowels:myString]
).In diesem Fall ruft die Instanz wahrscheinlich die Klassenmethode auf, sodass beide verfügbar sind. dh
im Grunde
myString.toLower()
Anrufe[String toLower:ownValue]
Es gibt keine endgültige Antwort, aber wenn Sie Lust haben, eine Klassenmethode einzuschieben, wird Ihr Code verbessert, probieren Sie es aus und denken Sie daran, dass Sie mit einer Klassenmethode nur andere Klassenmethoden / -variablen verwenden können.
quelle
Klassenmethoden
sind Methoden, die als statisch deklariert sind. Die Methode kann aufgerufen werden, ohne eine Instanz der Klasse zu erstellen. Klassenmethoden können nur für Klassenmitglieder und nicht für Instanzmitglieder ausgeführt werden, da Klassenmethoden keine Instanzmitglieder kennen. Instanzmethoden der Klasse können auch nicht innerhalb einer Klassenmethode aufgerufen werden, es sei denn, sie werden für eine Instanz dieser Klasse aufgerufen.
Instanzmethoden
Auf der anderen Seite muss eine Instanz der Klasse vorhanden sein, bevor sie aufgerufen werden kann. Daher muss eine Instanz einer Klasse mithilfe des neuen Schlüsselworts erstellt werden. Instanzmethoden arbeiten mit bestimmten Instanzen von Klassen. Instanzmethoden werden nicht als statisch deklariert.
quelle
In Objective-C beginnen alle Methoden entweder mit einem "-" oder "+". Beispiel:
Die Zeichen "+" und "-" geben an, ob eine Methode eine
class method
oder eine istinstance method
.Der Unterschied wäre klar, wenn wir diese Methoden aufrufen. Hier werden die Methoden in deklariert
MyClass
.instance method
erfordern eine Instanz der Klasse:Innerhalb
MyClass
anderer Methoden können Instanzmethoden wie folgt aufgerufenMyClass
werdenself
:Aber
class methods
muss auf die Klasse selbst aufgerufen werden:Oder:
Das wird nicht funktionieren:
quelle
KLASSENMETHODEN
Eine Klassenmethode erstellt normalerweise entweder eine neue Instanz der Klasse oder ruft einige globale Eigenschaften der Klasse ab. Klassenmethoden arbeiten nicht mit einer Instanz oder haben keinen Zugriff auf Instanzvariablen.
INSTANZMETHODEN
Eine Instanzmethode arbeitet mit einer bestimmten Instanz der Klasse. Die von Ihnen implementierte Zugriffsmethode sind beispielsweise alle Instanzmethoden. Sie verwenden sie, um die Instanzvariablen eines bestimmten Objekts festzulegen oder abzurufen.
AUFRUFEN
Um eine Instanzmethode aufzurufen, senden Sie die Nachricht an eine Instanz der Klasse.
Um eine Klassenmethode aufzurufen, senden Sie die Nachricht direkt an die Klasse.
Quelle: IOS - Objective-C - Klassenmethoden und Instanzmethoden
quelle
Klassenmethoden können den Wert einer Instanzvariablen nicht ändern oder kennen. Dies sollte das Kriterium sein, um zu wissen, ob eine Instanzmethode eine Klassenmethode sein kann.
quelle
Denken Sie auch daran, dass die gleiche Idee für Variablen gilt. Sie werden auf Begriffe wie statisch, Mitglied, Instanz, Klasse usw. stoßen, wenn Sie über Variablen sprechen, wie Sie es für Methoden / Funktionen tun würden.
Es scheint, dass der in der Obj-C-Community gebräuchliche Begriff ivar ist, zum Beispiel variabel, aber ich bin noch kein Obj-C-Typ.
quelle
Bei einer Aktualisierung der obigen Antworten stimme ich zu, dass Instanzmethoden eine Instanz einer Klasse verwenden, während eine Klassenmethode nur mit dem Klassennamen verwendet werden kann.
Es gibt keinen Unterschied mehr zwischen Instanzmethode und Klassenmethode, nachdem in Objective-C eine automatische Referenzzählung durchgeführt wurde.
Zum Beispiel
[NS StringWithformat:..]
eine Klassenmethode und[[NSString alloc] initwihtformat:..]
eine Instanzmethode, beide sind nach ARC gleichquelle
Hinweis: Dies ist nur im Pseudocode-Format
Klassenmethode
Fast alles, was es tun muss, ist während der Kompilierungszeit . Es sind keine Benutzereingaben erforderlich, und die Berechnung basiert nicht auf einer Instanz. Alles daran basiert auf der Klasse / Blaupause - was einzigartig ist, dh Sie haben nicht mehrere Blaupausen für eine Klasse. Können Sie während der Kompilierungszeit verschiedene Variationen haben? Nein, daher ist die Klasse eindeutig. Unabhängig davon, wie oft Sie eine Klassenmethode aufrufen, ist der Zeiger, der darauf zeigt, derselbe.
Instanzmethode
Im Gegenteil, die Instanzmethode findet zur Laufzeit statt, da Sie erst dann eine Instanz von etwas erstellt haben, das bei jeder Instanziierung variieren kann.
Wenn Sie aus anderen Sprachen kommen Statische Methoden sind dieselben wie Klassenmethoden.
Wenn Sie von Swift kommen, sind die Typmethoden mit den Klassenmethoden identisch.
quelle
Zu den obigen Antworten hinzufügen
Die Klassenmethode funktioniert für Klassen. Wir verwenden diese Methode für allgemeine Zwecke, z. B. + stringWithFormat, Klassengröße und vor allem für init usw.
Die Instanzmethode funktioniert für eine Instanz einer Klasse, nicht für eine Klasse, wie wir zwei Personen haben, und wir möchten den Rest jeder Instanz separat kennenlernen. Hier müssen wir die Instanzmethode verwenden. Weil es keine allgemeine Antwort zurückgibt. zB wie bestimmen die Anzahl der NSSArray etc.
quelle