Was bedeuten die Plus- und Minuszeichen in Objective-C neben einer Methode?

178

In Objective-C möchte ich wissen, was die Zeichen +und -neben einer Methodendefinition bedeuten.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
Gyurisc
quelle

Antworten:

225

+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 .

Georg Schölly
quelle
62
Es ist fast so, als wären die zusätzlichen fünf Zeichen von "statisch" irgendwie zu viel für sie.
Anon.
23
@Anon: Die Methoden sind nicht statisch. Sie sind Klassenmethoden. Sie können überschrieben werden und sind ein wesentlicher Bestandteil der Klassenhierarchie. statisch impliziert etwas ganz anderes in C.
bbum
4
@Avon, das ist Apfel für dich, sie lassen auch einen Blitz auf ihrer Kamera und einen rechten Knopf auf ihren Mäusen aus. =)
Pokstad
13
@bbum ist auf dem Geld. Die Tatsache, dass Java das Schlüsselwort "static" neu verwendet hat, um etwas anderes zu bedeuten, ist nicht die Schuld des viel älteren C. Während seine Verwendung in C möglicherweise nicht ganz intuitiv ist, scheint es in Java noch weniger zu sein. Ich würde erwarten, dass statisch das Gegenteil von dynamisch ist - etwas, das sich nicht ändert. Und natürlich gab es die Objective-C-Sprache fast 15 Jahre lang, bevor Apple sie in OS X übernahm.
Quinn Taylor
3
Der Unterschied zwischen einer statischen und einer Klassenmethode: Definieren Sie die Methode + foo in MYBaseClass und ihrer Unterklasse MYSubClass. NSArray * classes = @ [[MYBaseClass-Klasse], [MYSubClass-Klasse]]; [Klassen makeObjectsPerformSelector: @selector (foo)]; Würde mit einer statischen Methode nicht funktionieren. Das heißt, ich hätte ein @classmethodund @methododer so auch vorgezogen . Warum so knapp ...?
uliwitness
43

(+) 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];
Vandit Mehta
quelle
18

+ 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 .

Robert Christie
quelle
Nun, tatsächlich haben Klassenmethoden Zugriff auf Instanzvariablen, sie haben nur keine Instanz als 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; }
uliwitness
5

Die endgültige Erklärung von Apple finden Sie hier im Abschnitt "Methoden und Messaging":

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

In Kürze:

+ bedeutet 'Klassenmethode'

(Methode kann aufgerufen werden, ohne dass eine Instanz der Klasse instanziiert wird). Sie nennen es also so:

[className classMethod]; 


- bedeutet "Instanzmethode"

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";

Chris Halcrow
quelle