Frage

Was ist der Unterschied zwischen einer Klassenmethode und einer Instanzmethode?

Sind Instanzmethoden die Accessoren (Getter und Setter), während Klassenmethoden sind so ziemlich alles andere?

War es hilfreich?

Lösung

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

@interface MyClass : NSObject

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

@end

Sie könnten dann wie so verwendet werden:

[MyClass aClassMethod];

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

Einige realen Welt Beispiele für Klassenmethoden sind die vereinfachten Methoden auf vielen Foundation Klassen wie NSString der +stringWithFormat: oder NSArray des +arrayWithArray:. Eine Instanzmethode NSArray Methode des -count würde.

Andere Tipps

Alle technischen Details sind in den anderen Antworten gut abgedeckt. Ich möchte nur eine einfache Analogie teilen, dass ich denke, schön ist der Unterschied zwischen einer Klasse zeigt und eine Instanz:

eingeben Bild Beschreibung hier

Klasse ist wie der Entwurf ein Hauses. Sie haben nur einen Plan und (in der Regel), die Sie nicht tun können, dass viel mit dem Entwurf allein

eingeben Bild Beschreibung hier

Ein Beispiel: (oder Objekt ) ist das eigentliche Haus , dass Sie basierend auf dem Bauplan bauen: Sie können viele Häuser bauen aus der gleiche Entwurf. Sie können dann die Wände eine andere Farbe in jedem der Häuser malen, wie Sie unabhängig die Eigenschaften jeder Instanz einer Klasse ändern können die anderen Instanzen ohne zu beeinflussen.

Wie die anderen Antworten gesagt haben, arbeiten Instanz-Methoden auf ein Objekt und hat Zugriff auf seine Instanzvariablen, während eine Klassenmethode für eine Klasse als Ganzes funktioniert und hat keinen Zugriff auf eine bestimmte Instanz Variablen (sofern Sie die Instanz übergeben als Parameter).

Ein gutes Beispiel für eine Klassenmethode ist ein Zähler-Typ-Verfahren, das die Gesamtzahl von Instanzen einer Klasse gibt. Klassenmethoden beginnen mit einem +, während beispielsweise diejenigen mit einem - starten. Zum Beispiel:

static int numberOfPeople = 0;

@interface MNPerson : NSObject {
     int age;  //instance variable
}

+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end

@implementation MNPerson
- (id)init{
    if (self = [super init]){
          numberOfPeople++;
          age = 0;
    }    
    return self;
}

+ (int)population{ 
     return numberOfPeople;
}

- (int)age{
     return age;
}

@end

main.m:

MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);

Ausgabe: Alter: 0 Anzahl der Personen: 2

Ein weiteres Beispiel ist, wenn Sie eine Methode, die der Benutzer möchte in der Lage zu nennen, manchmal ist es gut, dass eine Klassenmethode zu machen. Wenn Sie eine Klasse namens MathFunctions Zum Beispiel haben, können Sie dies tun:

+ (int)square:(int)num{ 
      return num * num;
}

So würde der Benutzer aufrufen:

[MathFunctions square:34];

, ohne jemals die Klasse zu instanziiert zu haben!

Sie können auch Klassenfunktionen für die Rückgabe Autoreleased Objekte, wie NSArray der

verwenden
+ (NSArray *)arrayWithObject:(id)object

Das dauert ein Objekt, bringt es in einem Array und gibt eine Autoreleased Version des Arrays, die nicht Speicher verwaltet sein muss, groß für temperorary Arrays und was nicht.

Ich hoffe, dass Sie jetzt verstehen, wann und / oder warum sollten Sie Klassenmethoden verwenden !!

Eine Instanzmethode gilt für eine Instanz der Klasse (das heißt ein Objekt), während ein Klassenmethode zur Klasse gilt selbst.

In C # eine Klasse Methode ist statisch markiert. Methoden und Eigenschaften nicht statisch markiert sind Instanzmethoden.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

Ich denke, der beste Weg, dies zu verstehen, ist bei alloc und init zu suchen. Es war diese Erklärung, die mir die Unterschiede zu verstehen erlaubt.

Klasse Methode

Eine Klassenmethode wird auf die Klasse als Ganzes angewandt. Wenn Sie die alloc Methode überprüfen, das ist eine Klassenmethode durch die + vor der Methodendeklaration bezeichnet. Es ist eine Klassenmethode, weil es auf die Klasse angewandt wird, eine bestimmte Instanz dieser Klasse zu machen.

Instanzmethode

Sie verwenden eine Instanz Methode eine bestimmte Instanz einer Klasse zu ändern, die zu diesem Fall einzigartig ist, und nicht auf die Klasse als Ganzes. init zum Beispiel (mit einem - vor der Methodendeklaration bezeichnet), ist eine Instanz Methode, weil Sie in der Regel sind die Eigenschaften dieser Klasse zu modifizieren, nachdem sie mit alloc erstellt wurde.

Beispiel:

NSString *myString = [NSString alloc];

Sie fordern die Klassenmethode alloc um eine Instanz dieser Klasse zu erzeugen. Beachten Sie, wie der Empfänger der Nachricht ist eine Klasse.

[myString initWithFormat:@"Hope this answer helps someone"];

Sie ändern die Instanz von NSString genannt myString, indem Sie auf dieser Instanz einige Eigenschaften festlegen. Beachten Sie, wie der Empfänger der Nachricht ist eine Instanz (Objekt der Klasse NSString).

Die Antwort auf Ihre Frage zu Objective-C nicht spezifisch ist, jedoch in verschiedenen Sprachen, Klassenmethoden statische Methoden aufgerufen werden können.

Der Unterschied zwischen Klassenmethoden und Instanzmethoden sind

Klassenmethoden

  • Betreiben Sie auf Klassenvariablen (sie können nicht Instanzvariablen zugreifen)
  • Sie nicht ein Objekt erfordern instanziert werden angewendet werden
  • Manchmal kann ein Code Geruch sein (einige Leute, die als Krücke zu OOP Verwendung neu sind Strukturierte Programmierung in einer OO-Umgebung zu tun)

Instanzmethoden

  • Betreiben Sie auf Instanzen Variablen und Klassenvariablen
  • Muss ein instanziiert Objekt arbeiten müssen auf

Klassenmethoden in der Regel verwendet werden Instanzen dieser Klasse erstellen

Zum Beispiel [NSString stringWithFormat:@"SomeParameter"]; gibt eine NSString Instanz mit dem Parameter, die es gesendet wird. Daher, weil es eine Klasse-Methode ist, die ein Objekt seiner Art zurückgibt, wird es auch eine bequeme Methode genannt.

Also, wenn ich verstehe es richtig.

Ein class Methode nicht benötigen Sie Instanz dieses Objekt zuzuweisen, es zu benutzen / Prozess. Ein class Methode ist in sich geschlossen und kann ohne Abhängigkeit von dem Zustand eines beliebigen Objekts der Klasse arbeiten. Ein class Verfahren wird erwartet, dass Speicher für alle seine eigene Arbeit und ausplanen zuzuweisen, wenn Sie fertig, da keine Instanz dieser Klasse beliebigen Speicher in früheren Aufforderungen an die Klassenmethode zugeordnet befreien können.

Ein instance Verfahren ist genau das Gegenteil. Sie können es nicht nennen, wenn Sie eine Instanz dieser Klasse zuzuordnen. Es ist wie eine normale Klasse, die einen Konstruktor und eine destructor haben kann (dass alle zugewiesenen Speicher bereinigt).

In den meisten Wahrscheinlichkeit (es sei denn, Sie eine wiederverwendbare Bibliothek schreiben, sollten Sie keine class Variable benötigen.

Instanzen Verfahren arbeiten auf Instanzen von Klassen (dh „Objekte“). Klassenmethoden sind mit Klassen zugeordnet (die meisten Sprachen verwenden Sie das Schlüsselwort static für diese Männer).

Nehmen Sie zum Beispiel ein Spiel, wo viele Autos hervorgebracht werden .. jeder gehört zur Klasse CCAR. Wenn ein Auto instanziert wird, macht es einen Aufruf an

[CCar registerCar:self]

So die CCAR Klasse kann eine Liste aller CCAR instanziiert machen. Nehmen wir an, der Benutzer eine Ebene abgeschlossen ist, und will alle Autos entfernen ... Sie können entweder: 1- Gehen Sie durch eine Liste aller CCAR Sie manuell erstellt haben, und tun whicheverCar.remove(); oder 2- hinzufügen removeAllCars Methode CCAR, die das für Sie tun, wenn Sie anrufen [CCAR removeAllCars]. D. h allCars[n].remove();

Oder zum Beispiel, können Sie dem Benutzer eine Standardschriftgröße für die gesamte App spezifizieren, die geladen wird und beim Start gespeichert. Ohne die Klassenmethode, könnte man so etwas zu tun hat,

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

Mit der Klassenmethode, die Sie [FontHandler getDefaultFontSize] wegkommen können.

Wie für Ihre removeVowels Funktion, werden Sie feststellen, dass Sprachen wie C # tatsächlich beide mit bestimmten Methoden wie toLower oder toUpper.

z. myString.removeVowels() und String.removeVowels(myString) (in ObjC die [String removeVowels:myString] würde).

In diesem Fall wird die Instanz ruft wahrscheinlich die Klassenmethode, so sind beide verfügbar. d.

public function toLower():String{
  return String.toLower();
}

public static function toLower( String inString):String{
 //do stuff to string..
 return newString;
}

im Grunde, myString.toLower() nennt [String toLower:ownValue]

Es gibt keine definitive Antwort, aber wenn Sie eine Klassenmethode schiebend fühlen wie in Ihrem Code verbessern würde, geben Sie ihm einen Schuss, und bedenken Sie, dass eine Klassenmethode wird nur lassen Sie andere Klasse Methoden / Variablen.

Klassenmethoden

sind Methoden, die als statisch deklariert sind. Das Verfahren kann ohne eine Instanz der Klasse bezeichnet werden. Klassenmethoden können nur auf Klassenmitglieder arbeiten und nicht auf Instanzmitglieder als Klassenmethoden nicht bewusst Instanz Mitglieder sind. Instanzmethoden der Klasse können auch nicht aus einer Klassenmethode aufgerufen werden, wenn sie nicht auf einer Instanz dieser Klasse aufgerufen werden.

Instanzmethoden

auf der anderen Seite erfordert eine Instanz der Klasse zu bestehen, bevor sie aufgerufen werden kann, so dass eine Instanz einer Klasse erstellt werden muss, indem das neue Schlüsselwort. Instanzmethoden arbeiten auf bestimmte Instanzen von Klassen. Instanzmethoden werden nicht als statisch deklariert.

In Objective-C alle Methoden beginnen entweder mit einem "-" oder "+" Zeichen. Beispiel:

@interface MyClass : NSObject
// instance method
- (void) instanceMethod;

+ (void) classMethod;
@end

Das „+“ und „-“. Zeichen angeben, ob ein Verfahren ein class method oder ein instance method jeweils

Der Unterschied wäre klar, wenn wir diese Methoden aufrufen. Hier werden die Methoden sind in MyClass erklärt.

instance method erfordern eine Instanz der Klasse:

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

Innerhalb MyClass andere Methoden Instanzmethoden MyClass mit self nennen kann:

-(void) someMethod
{
    [self instanceMethod];
}

Aber class methods muss auf der Klasse aufgerufen werden selbst:

[MyClass classMethod];

Oder:

MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];

Das wird nicht funktionieren:

// Error
[myClass classMethod];
// Error
[self classMethod];

Klassenmethoden


Eine Klassenmethode typischerweise entweder erstellt eine neue Instanz der Klasse oder ruft einige globalen Eigenschaften der Klasse. Klassenmethoden funktionieren nicht auf eine Instanz oder haben keinen Zugang zu Instanzvariable.


instance methods


Eine Instanz Verfahren arbeitet auf einer bestimmten Instanz der Klasse. Zum Beispiel kann die Zugriffsmethode, die Sie alle Instanzmethoden implementiert sind. Mit ihnen setzen oder die Instanzvariablen eines bestimmten Objekts zu erhalten.


INVOKE


eine Instanz Methode aufzurufen, können Sie die Nachricht an eine Instanz der Klasse senden.

eine Klassenmethode aufzurufen, können Sie die Nachricht an die Klasse senden direkt an.


Quelle: IOS - Objective-C - Klasse Methoden und Instanzmethoden

Klassenmethoden können nicht den Wert einer Instanzvariablen ändern oder wissen. Das sollte die Kriterien sein, zu wissen, ob eine Instanz Methode eine Klassenmethode sein kann.

Denken Sie auch daran, die gleiche Idee zu Variablen gilt. Sie werden über Begriffe wie statisch kommen, Mitglied, eine Instanz der Klasse und so weiter, wenn man über Variablen die gleiche wie für Methoden / Funktionen.

Es scheint der gemeinsame Begriff in dem Obj-C Community Ivar zum Beispiel variabel ist, aber ich bin nicht ein Obj-C Kerl, noch nicht.

Ein Update auf die oben genannten Antworten stimme ich Instanzmethoden eine Instanz einer Klasse zu verwenden, während eine Klassenmethode kann nur mit dem Klassennamen verwendet werden.

Es gibt nicht mehr einen Unterschied zwischen Instanzmethode & Klassenmethode nach dem automatischen Referenzzählung auf Existenz in Objective-C kam.

Für Example[NS StringWithformat:..] eine Klassenmethode & [[NSString alloc] initwihtformat:..] eine Instanzmethode, die beide gleich sind nach ARC

Hinweis: Dies ist nur in Pseudo-Code-Format

Klasse Methode

Fast alle tut es tun muss, während wird kompilieren Zeit . Es braucht keine Benutzereingabe, noch die Berechnung auf einer Instanz basiert. Alles darüber wird basierend auf der Klasse / Plan - das einzigartig ist also nicht mehrere Pläne für eine Klasse verfügen. Können Sie während der Kompilierung verschiedene Variationen haben? Nein, deshalb ist die Klasse einzigartig und so egal, wie oft Sie eine Klassenmethode der Zeiger rufen auf mich zeigen würden gleich sein.

PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.

Instanzmethode

Im Gegensatz Instanzmethode geschieht während der Laufzeit, da es ist nur dann , dass Sie eine Instanz von etwas geschaffen haben, die bei jeder Instanzierung variieren kann.

initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.

Wenn Sie aus anderen Sprachen Statische Methoden kommen gleich sind wie Klassenmethoden.
Wenn Sie von Swift kommen, sind Typ Methoden gleiche wie Klassenmethoden.

Zusätzlich zu oben genannten Antworten

Klasse Methode wird auf Klasse arbeiten, werden wir dies für allgemeine Zwecke verwenden, bei denen wie + string, Größe der Klasse und vor allem für init etc

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

Instanzmethode wird auf eine Instanz einer Klasse arbeiten nicht auf eine Klasse, wie wir zwei Personen haben, und wir wollen das Gleichgewicht der jeweils separat bekommen wissen, hier brauchen wir Instanzmethode verwenden. Denn es wird nicht wieder allgemeine Antwort. z.B. wie bestimmt die Zählung der NSSArray etc.

[johnson getAccountBalance];
[ankit getAccountBalance];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top