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?
Antwort
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.
Statische Memberfunktionen werden informell Klasse Methoden (falsch) genannt. In C++ gibt es keine Methoden, es gibt Member-Funktionen.
Lesen Sie auf dem statischen Schlüsselwort, dass es ziemlich deckt.
MSDN: http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx
Google-Suche: http://www.google.ch/search?aq=f&sourceid=chrome&ie=UTF-8&q=static+keyword+c%2B%2B
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();
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
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];
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
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 NSArray
s -count
Methode.
- 1. Kann ich Klassenmethoden und Instanzmethoden aus demselben Modul hinzufügen?
- 2. In Objective-C, wann sollte ich Klassenmethoden verwenden und wann sollte ich Instanzmethoden verwenden?
- 3. Auswahl zwischen Instanzmethoden und freien Funktionen?
- 4. Zweck der Instanzmethoden gegen Klassenmethoden in Objective-C
- 5. Warum werden in SendwithUs Instanzmethoden anstelle von Klassenmethoden definiert?
- 6. Was ist der Unterschied zwischen Einschließen und Erweitern in Ruby?
- 7. Wie teilen Sie Klassenmethoden zwischen mehreren Datenmodellen in Rails?
- 8. Gibt es einen Unterschied zwischen :: und? beim Aufruf von Klassenmethoden in Ruby?
- 9. Objective-C: Klassen- gegen Instanzmethoden?
- 10. Unterschied zwischen Vorzeichen & und *?
- 11. VBA: Unterschied zwischen & und +
- 12. Unterschied zwischen "**/* /" und "** /"?
- 13. Unterschied zwischen $ # und $ {# @}
- 14. Unterschied zwischen = und: =
- 15. Unterschied zwischen '#', '%' und '$'
- 16. MySQL: Unterschied zwischen ', `,' und '
- 17. C++ Unterschied zwischen '//' und '///'
- 18. Unterschied zwischen String.Empty und ""
- 19. Unterschied zwischen `% in%` und `==`
- 20. Unterschied zwischen numpy.logical_and und &
- 21. Unterschied zwischen. und #
- 22. Unterschied zwischen // und http: //
- 23. Synchronisieren von Code zwischen Jupyter/iPython Notebook-Skript und Klassenmethoden
- 24. Java: Name Mehrdeutigkeit zwischen äußeren und inneren Klassenmethoden
- 25. Unterschied zwischen -Wconversion zwischen gcc und g ++
- 26. Unterschied zwischen Wörterbuch und Hashtable
- 27. Unterschied zwischen FetchMode und FetchType
- 28. Unterschied zwischen Application_Start und Application_OnStart
- 29. Unterschied zwischen Uint8Array und Uint8ClampedArray
- 30. Unterschied zwischen BOOST_CHECK_CLOSE und BOOST_CHECK_CLOSE_FRACTION?
Sprechen Sie wirklich über C++? Wir verwenden nicht die Begriffe "Instanzmethode" und "Klassenmethode"; Wir verwenden die Begriffe "(nicht statische) Elementfunktion" und "statische Elementfunktion". –
Jetzt über objective-c sprechen ??? – jopasserat
@jHackTheRipper, ja. – Tirth