2010-06-30 20 views

Antwort

12

die müden alten Auto Analogie Mit ...

Denken Sie an eine Klasse, wie es ist eine Fabrik, die Instanzen der Klasse. Zum Beispiel könnten Sie eine Car-Klasse haben und Sie könnten eine Methode deklarieren wie:

+ carWithColor: (NSColor *) aColor; 

Und dieser Methode würde dann eine neue Auto-Instanz erstellen, legen Sie die Farbe und schicken Sie es:

+ carWithColor: (NSColor *) aColor 
{ 
    Car *aCar = [[[self alloc] init] autorelease]; 
    [aCar paintWithColor: aColor]; 
    return aCar; 
} 

Nun würde diese Car-Klasse eine Instanzmethode deklarieren, die es erlaubt, das Auto zu lackieren. Warum eine Instanzmethode? Weil jedes Auto eine andere Farbe haben kann (und die Farbe des Autos würde wahrscheinlich in einer Instanzvariable gespeichert werden).

- (void) paintWithColor: (NSColor *) aColor 
{ 
    ... do your paint stuff here ... 
} 

Dies ist in dem Objects, Classes, and Messaging Abschnitt der Objective-C-Dokumentation erläutert.

-1

Klasse Methode Signaturen werden mit +, Instanzmethoden mit dem Präfix - so in der Header-Datei Deklarationen wie folgt aussehen würde:

-(void)setAllThings:(NSArray*)things; //instance method 
+(void)setAllClassThings:(NSArray*)things; //class method 

Und natürlich die gleichen Regeln gelten, wenn Sie die Methoden in die definieren. m Datei.

+0

ich weiß, wie sie erklären, zusammen mit seiner Syntax auch. Aber ich weiß nicht, das Konzept hinter, warum wir Klassenmethode und Instanzmethode implementieren müssen? – Tirth

+1

iHungry, denken Sie darüber nach, wenn Sie kein Objekt instanzieren oder Getter oder Setter setzen müssen und vielleicht etwas abgeleitet bekommen, ohne ein Objekt tatsächlich zu initialisieren, dann sind Klassenmethoden nützlich. Da die Zuweisung und Initialisierung von Klassenmethoden im Hintergrund stattfindet, können Sie eine Klassenmethode aufrufen und eine Rückgabe in irgendeiner Form erhalten, ohne das Objekt zu initialisieren und den Schmerzprozess von alloc, init und release zu durchlaufen. Wenn Sie in der Standard-Kopfzeile von iOS bemerken, werden Sie feststellen, dass die Klassenmethoden Ihnen meistens ein Objekt zurückgeben. – kforkarim

0

Instanz Methoden Dinge tun, mit Instanzen einer Klasse:

NSString *myString; 
myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease]; 
NSLog (@"myString's length: %u", [myString length]); // instance method 

Klasse Methoden können, ohne sich auf eine Objektinstanz klassenspezifische Dinge zu tun, die oft eine Instanz der Rückkehr Klasse oder ein anderes klassenspezifische Ergebnis:

NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method 

I t hink kann es selten sein, Klassenmethoden zu sehen, die etwas nicht zurückgeben.

+0

Ein Beispiel für eine Klassenmethode, die nichts zurückgibt, ist '[UIView + setAnimationsEnabled:]' - dh, eine Klassenmethode kann Änderungen auf alle Instanzen anwenden. –

0

Sie müssen nicht beide implementieren. Beide Optionen stehen Ihnen beim Entwerfen Ihrer Klasse zur Verfügung.

Eine Instanzmethode kann für eine Instanz der Klasse verwendet werden. Dies kann eine Eigenschaft abrufen oder festlegen oder Verhalten verursachen, das nur diese Instanz ausführen soll. Sie müssen tatsächlich über eine Instanz verfügen, um es zu verwenden. Diese können den Status der Instanz entweder verwenden oder ändern.

// Notional instance methods 
myHouse.color = blueColor; 

[myCar accelerate]; 
speed = myCar.speed; 

Eine Klassenmethode basiert auf der Idee, dass die Klasse existiert. Es kann verwendet werden, um eine Instanz zu erstellen, oder um eine Berechnung durchzuführen, die nicht von einer Instanz abhängig ist. Möglicherweise haben Sie eine Klasse für benutzerdefinierte Mathehelfer, die im Wesentlichen Funktionen enthält.

// Notional class method uses 
myString = [NSString stringWithFormat:@"&f", floatToConvert]; 

myResult = [MyMathHelper MyFunctionWithInput:myInput]; 
6

Dies ist ein alter Post, aber da es zuerst in einer Google-Suche kommt, dachte ich, ich würde hinzufügen.

Ich werde nicht über Klassenmethoden sprechen, die als Fabrikmethoden verwendet werden. Ich möchte über ihre Verwendung in Utility-Methoden sprechen.Sie können/sollten Klassenmethoden für vom Zustand unabhängige Utility-Methoden verwenden. Was bedeutet das? Nun, wenn Sie beispielsweise ein Datum für alle Instanzen auf die gleiche Weise formatieren, ist das eine Hilfsmethode, die eine Klassenmethode sein sollte. Stellen Sie sich die Utility-Methode wie einen Schraubenzieher vor. Sie müssen nicht jedes Mal eine neue Instanz des Schraubenziehers erstellen, wenn Sie etwas damit machen wollen. Der Schraubenzieher bleibt konstant. So habe ich zum Beispiel eine Klasse, die eine private Methode enthält, die eine Reihe von emDashes generiert, die für die Anzeige in der Ansicht verwendet werden. Diese Methode hängt nicht vom Status ab und variiert daher nicht von Fall zu Fall. Denken Sie an Klassen-Utility-Methoden wie Konstanten.

+ (NSString *)emDashString { 
return @" \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014"; 

}

Sie diese Methode allgemein innerhalb der Klasse aufrufen können (es ist privat in meinem Beispiel) wie folgt aus:

NSString *string = [[self class] emDashString ]; 

ich ein bisschen ein triviales Beispiel bewusst gewählt haben, um fahre den Punkt nach Hause. Sie würden dies nur als eine Klassen-Utility-Methode betrachten, wenn Sie diese Zeichenfolge mehrmals in Ihrer Klasse benötigen. Beachten Sie, dass ich die Klasse nicht mit dem Namen referenziere, sondern generisch mit [self class], da dies intern aufgerufen wird. Wenn es verfügbar ist und Sie es von einer anderen Klasse aufrufen möchten, dann beziehen Sie sich wie üblich auf den Klassennamen.

+0

Ich mag diese Erklärung besser als die Fabrik Idee. Schließlich kann eine Car-Instanz erstellt werden mit: Car * car = [[Car alloc] init]; Und dann mit einer anderen Instanzmethode gemalt, so sehe ich die Factory-Analogie nicht wirklich als sehr nützlich. Aber die state/statuslose Idee ist sehr nützlich und verwendet Klassenmethoden, um konstante Werte zurückzugeben. Hervorragende Erklärung. –

+0

Und ich nehme an, es gibt weniger Overhead beim Aufruf einer Klassenmethode, weshalb es wichtig ist zu verstehen, wann sie zu verwenden sind. –

Verwandte Themen