Antworten:
+
ist für eine Klassenmethode und -
ist für eine Instanzmethode.
Z.B
// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end
// somewhere else:
id myArray = [NSArray array]; // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4]; // here the message is sent to myArray
// Btw, in production code one uses "NSArray *myArray" instead of only "id".
Es gibt noch eine andere Frage, die sich mit dem Unterschied zwischen Klassen- und Instanzmethoden befasst .
@classmethod
und @method
oder so auch vorgezogen . Warum so knapp ...?
(+) für Klassenmethoden und (-) zum Beispiel Methode,
(+) 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 mit dem neuen Schlüsselwort erstellt werden. Instanzmethoden arbeiten mit bestimmten Instanzen von Klassen. Instanzmethoden werden nicht als statisch deklariert.
Wie erstelle ich?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
Wie benutzt man?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ Methoden sind Klassenmethoden, dh Methoden, die keinen Zugriff auf die Eigenschaften einer Instanz haben. Wird für Methoden wie Zuordnungs- oder Hilfsmethoden für die Klasse verwendet, für die kein Zugriff auf Instanzvariablen erforderlich ist
- Methoden sind Instanzmethoden - beziehen sich auf eine einzelne Instanz eines Objekts. Wird normalerweise für die meisten Methoden einer Klasse verwendet.
Weitere Informationen finden Sie in der Sprachspezifikation .
self
, sondern die Klasse. Sie sind einfach keiner Instanz zugeordnet, und die Methodensuche erfolgt nicht über die Instanz, sondern über die Klasse. Trotzdem könnten Sie tun+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Die endgültige Erklärung von Apple finden Sie hier im Abschnitt "Methoden und Messaging":
In Kürze:
(Methode kann aufgerufen werden, ohne dass eine Instanz der Klasse instanziiert wird). Sie nennen es also so:
[className classMethod];
Sie müssen zuerst ein Objekt instanziieren, dann können Sie die Methode für das Objekt aufrufen. Sie können ein Objekt wie folgt manuell instanziieren:
SomeClass* myInstance = [[SomeClass alloc] init];
(Dies ordnet im Wesentlichen Speicherplatz für das Objekt zu und initialisiert dann das Objekt in diesem Raum - eine übermäßige Vereinfachung, aber eine gute Möglichkeit, darüber nachzudenken. Sie können das Objekt separat zuweisen und initiieren , dies jedoch niemals tun. Dies kann zu unangenehmen Problemen im Zusammenhang mit Zeigern führen und Speicherverwaltung)
Rufen Sie dann die Instanzmethode auf:
[myInstance instanceMethod]
Eine alternative Möglichkeit, eine Instanz eines Objekts in Ziel C abzurufen, lautet wie folgt:
NSNumber *myNumber = [NSNumber numberWithInt:123];
welches der Aufruf der ‚numberWithInt‘ Klassenmethode der NSNumber - Klasse, die ein ‚Fabrik‘ Verfahren (dh einer Methode , die Sie mit einer ‚bereit gemacht Instanz‘ ein Objekt bereitstellt) ist.
Ziel C ermöglicht auch die Erstellung bestimmter Objektinstanzen direkt mit einer speziellen Syntax, wie im Fall einer Zeichenfolge wie dieser:
NSString * myStringInstance = @ "abc";