2010-12-07 20 views
1

Ich verwirre immer, wenn ich Instanz-Methode und Klassenmethode in Programmierung verwendet. Bitte erzähle mir den Unterschied zwischen Instanzmethode und Klassenmethoden und Vorteilen voneinander.Unterschied zwischen Klassenmethoden und Instanzmethoden?

+0

Sprechen Sie wirklich über C++? Wir verwenden nicht die Begriffe "Instanzmethode" und "Klassenmethode"; Wir verwenden die Begriffe "(nicht statische) Elementfunktion" und "statische Elementfunktion". –

+0

Jetzt über objective-c sprechen ??? – jopasserat

+0

@jHackTheRipper, ja. – Tirth

Antwort

11

Alle anderen Antworten scheinen von dem falschen Tag abgefangen worden zu sein, der jetzt behoben wurde.

In Objective-C ist eine Instanzmethode eine Methode, die aufgerufen wird, wenn eine Nachricht an eine Instanz einer Klasse gesendet wird. So zum Beispiel:

id foo = [[MyClass alloc] init]; 
[foo someMethod]; 
// ^^^^^^^^^^ This message invokes an instance method. 

In Objective-C, Klassen sind selbst Objekte und eine Klassenmethode ist einfach eine Methode, die aufgerufen wird, wenn eine Nachricht an eine Klassenobjekt gesendet wird. d.h.

[MyClass someMethod]; 
//  ^^^^^^^^^^ This message invokes a class method. 

anzumerken, dass in den obigen Beispielen der Selektor das gleiche ist, aber da in dem einem Fall wird es zu einer Instanz von MyClass und im anderen Fall es MyClass gesendet gesendet wird, werden verschiedene Methoden aufgerufen. In der Interface-Deklaration, könnten Sie sehen:

@interface MyClass : NSObject 
{ 
} 

+(id) someMethod; // declaration of class method 
-(id) someMethod; // declaration of instance method 

@end 

und bei der Umsetzung

@implementation MyClass 

+(id) someMethod 
{ 
    // Here self is the class object 
} 
-(id) someMethod 
{ 
    // here self is an instance of the class 
} 

@end 

bearbeiten

Sorry, den zweiten Teil verpasst. Es gibt keine Vor- oder Nachteile als solche. Es wäre so, als würde man fragen, was ist der Unterschied zwischen while und if und was sind die Vorteile der einen gegenüber der anderen? Es ist irgendwie bedeutungslos, weil sie für verschiedene Zwecke konzipiert sind.

Die häufigste Verwendung von Klassenmethoden besteht darin, eine Instanz zu erhalten, wenn Sie eine benötigen. +alloc ist eine Klassenmethode, die Ihnen eine neue nicht initialisierte Instanz gibt. NSString enthält viele Klassenmethoden, um Ihnen neue Zeichenfolgen zu geben, z. + stringWithForma

Eine andere gebräuchliche Verwendung besteht darin, ein Singleton z.B.

+(MyClass*) myUniqueObject 
{ 
    static MyUniqueObject* theObject = nil; 
    if (theObject == nil) 
    { 
     theObject = [[MyClass alloc] init]; 
    } 
    return theObject; 
} 

Die obige Methode funktioniert auch als Instanzmethode, da das Objekt statisch ist. Die Semantik ist jedoch klarer, wenn Sie sie zu einer Klassenmethode machen und Sie nicht erst eine Instanz erstellen müssen.

0

Statische Memberfunktionen werden informell Klasse Methoden (falsch) genannt. In C++ gibt es keine Methoden, es gibt Member-Funktionen.

1

Ich weiß nicht, ob wir irgend Vorteil sprechen kann, ist dies eher eine Frage dessen, was Sie umsetzen.

Instanzmethoden anwenden auf Instanzen von Klassen, also müssen sie ein Objekt auf angewendet werden und ihre Anrufers Mitglieder zugreifen können:

Foo bar; 
bar.instanceMethod(); 

Auf der anderen Seite Klassenmethoden anwenden auf die ganze Klasse, sie don‘ Verlasse dich auf jedes Objekt:

Foo::classMethod(); 
4

Wenn wir nicht wollen, das Objekt der Klasse erstellen, dann verwenden wir die Klassenmethode , wenn wir das Verfahren durch Objekt einer Klasse aufrufen wollen, dann verwenden wir die Instanzmethode

0

Klassenmethoden sind mit Klassen verwendet, aber Instanzmethoden sind mit Objekten dieser Klasse dh Instanz

//Class method example 
className *objectName = [[className alloc]init]; 
[objectName methodName]; 

//Instance method example 
[className methodName]; 
0

Instanz-Methoden eine Instanz einer Klasse verwenden, verwendet, während kann eine Klassenmethode nur mit dem Klassennamen verwendet werden. + Vorzeichen wird vor der Klassenmethode verwendet, wobei vor der Instanzvariable als single desh (-) verwendet wird.

@interface MyClass : NSObject 

+ (void)aClassMethod; 
- (void)anInstanceMethod; 

@end 

Sie sehen auch so,

[MyClass aClassMethod]; 

MyClass *object = [[MyClass alloc] init]; 
[object anInstanceMethod]; 

oder ein anderes Beispiel ist

verwendet werden könnte:

[

NSString string]; //class method 

NSString *mystring = [NSString alloc]init]; 
[mystring changeText]; //instance Method 
0

Wie die meisten der anderen Antworten gesagt haben, instance methods Verwenden Sie eine Instanz einer Klasse, während eine Klassenmethode nur mit dem Klassennamen verwendet werden kann. In Objective-C sind sie thusly definiert:

@interface MyClass : NSObject 

+ (void)aClassMethod; 
- (void)anInstanceMethod; 

@end 

Sie könnten dann wie so verwendet werden:

// class methods must be called on the class itself 
[MyClass aClassMethod]; 

// instance method require an instance of the class 
MyClass *object = [[MyClass alloc] init]; 
[object anInstanceMethod]; 

Einige realen Welt Beispiele für Klassenmethoden sind die vereinfachten Methoden auf vielen Foundation Klassen wie NSString ‚s +stringWithFormat: oder NSArray+arrayWithArray:. Eine Instanzmethode wäre NSArrays -count Methode.

Verwandte Themen