Quelle est la différence entre une méthode de classe et une méthode d'instance?
Les méthodes d'instance sont-elles les accesseurs (getters et setters) alors que les méthodes de classe sont pratiquement tout le reste?
Comme la plupart des autres réponses l'ont dit, les méthodes d'instance utilisent une instance d'une classe, alors qu'une méthode de classe peut être utilisée uniquement avec le nom de la classe. En Objective-C, ils sont définis ainsi:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Ils pourraient alors être utilisés comme suit:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Certains exemples concrets de méthodes de classe sont les méthodes pratiques de nombreuses classes Foundation telles que NSString
'+stringWithFormat:
ou NSArray
' +arrayWithArray:
. Une méthode d'instance serait la méthode -count
de NSArray
.
Tous les détails techniques ont été bien traités dans les autres réponses. Je veux juste partager une analogie simple qui, à mon avis, illustre bien la différence entre une classe et une instance:
Un classe est semblable au plan directeur d'une maison: vous ne disposez que d'un plan directeur et (généralement) vous ne pouvez pas en faire autant avec le plan directeur seul.
Un instance (ou un objet) est l'actuel maison que vous construisez sur la base du plan: vous pouvez construire beaucoup de maisons à partir du même plan . Vous pouvez ensuite peindre les murs d'une couleur différente dans chacune des maisons, tout comme vous pouvez modifier indépendamment les propriétés de chaque instance d'une classe sans affecter les autres instances.
Comme l'ont dit d'autres réponses, les méthodes d'instance opèrent sur un objet et ont accès à ses variables d'instance, tandis qu'une méthode de classe opère sur une classe dans son ensemble et n'a pas accès aux variables d'une instance particulière (à moins que vous ne transmettiez l'instance en tant que paramètre).
Un bon exemple de méthode de classe est une méthode de type compteur, qui renvoie le nombre total d'instances d'une classe. Les méthodes de classe commencent par +
, tandis que celles d'instance commencent par -
. Par exemple:
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]);
Sortie: Age: 0 Nombre de personnes: 2
Un autre exemple est que si vous avez une méthode que vous souhaitez que l'utilisateur puisse appeler, il peut parfois être utile de faire de cette méthode une méthode de classe. Par exemple, si vous avez une classe appelée MathFunctions, vous pouvez faire ceci:
+ (int)square:(int)num{
return num * num;
}
Alors, l'utilisateur appelle:
[MathFunctions square:34];
sans jamais avoir à instancier la classe!
Vous pouvez également utiliser des fonctions de classe pour renvoyer des objets autoreleased, tels que ceux de NSArray.
+ (NSArray *)arrayWithObject:(id)object
Cela prend un objet, le place dans un tableau et renvoie une version auto-supprimée du tableau qui ne doit pas nécessairement être gérée par la mémoire, ce qui est idéal pour les tableaux de tempérament et autres.
J'espère que vous comprenez maintenant quand et/ou pourquoi vous devriez utiliser les méthodes de classe !!
Une méthode d'instance s'applique à une instance de la classe (c'est-à-dire un objet), tandis qu'une méthode de classe s'applique à la classe elle-même.
En C #, une méthode de classe est marquée comme statique. Les méthodes et propriétés non marquées static sont des méthodes d'instance.
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
Je pense que la meilleure façon de comprendre ceci est de regarder alloc
et init
. C'est cette explication qui m'a permis de comprendre les différences.
Méthode de classe
Une méthode de classe est appliquée à la classe dans son ensemble. Si vous cochez la méthode alloc
, il s'agit d'une méthode de classe désignée par le +
avant la déclaration de la méthode. C'est une méthode de classe car elle est appliquée à la classe pour créer une instance spécifique de cette classe.
méthode d'instance
Vous utilisez une méthode d'instance pour modifier une instance spécifique d'une classe propre à cette instance plutôt qu'à la classe dans son ensemble. init
par exemple (désigné par -
avant la déclaration de méthode), est une méthode d'instance car vous modifiez normalement les propriétés de cette classe après sa création avec alloc
.
Exemple
NSString *myString = [NSString alloc];
Vous appelez la méthode de classe alloc
afin de générer une instance de cette classe. Remarquez comment le destinataire du message est une classe.
[myString initWithFormat:@"Hope this answer helps someone"];
Vous modifiez l'instance de NSString
appelée myString
en définissant des propriétés sur cette instance. Notez que le destinataire du message est une instance (objet de classe NSString
).
La réponse à votre question n'est pas spécifique à objective-c, cependant, dans différentes langues, les méthodes de classe peuvent être appelées méthodes statiques.
La différence entre les méthodes de classe et les méthodes d’instance est
Méthodes de classe
Méthodes d'instance
Donc si je comprends bien.
Une méthode class
n'a pas besoin de vous pour allouer une instance de cet objet pour l'utiliser/le traiter. Une méthode class
est autonome et peut fonctionner sans aucune dépendance de l'état de tout objet de cette classe. Une méthode class
doit allouer de la mémoire pour son propre travail et être libérée à la fin, car aucune instance de cette classe ne pourra libérer la mémoire allouée lors des appels précédents à la méthode de classe.
Une méthode instance
est exactement l'inverse. Vous ne pouvez pas l'appeler à moins d'allouer une instance de cette classe. C'est comme une classe normale qui a un constructeur et peut avoir un destructeur (qui nettoie toute la mémoire allouée).
Très probablement (sauf si vous écrivez une bibliothèque réutilisable, vous ne devriez pas avoir besoin d'une variable class
.
Les méthodes de classe sont généralement utilisées pour créer des instances de cette classe
Par exemple, [NSString stringWithFormat:@"SomeParameter"];
renvoie une instance NSString
avec le paramètre qui lui est envoyé. Par conséquent, puisqu'il s'agit d'une méthode de classe qui renvoie un objet de ce type, elle est également appelée méthode de commodité.
Les méthodes d'instances opèrent sur des instances de classes ("objets"). Les méthodes de classe sont associées à des classes (la plupart des langages utilisent le mot clé static
pour ces types).
En Objective-C, toutes les méthodes commencent par un caractère "-" ou "+". Exemple:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
Les caractères "+" et "-" spécifient si une méthode est respectivement un class method
ou un instance method
.
La différence serait claire si nous appelons ces méthodes. Ici, les méthodes sont déclarées dans MyClass
.
instance method
nécessite une instance de la classe:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
À l'intérieur de MyClass
d'autres méthodes peuvent appeler des méthodes d'instance de MyClass
à l'aide de self
:
-(void) someMethod
{
[self instanceMethod];
}
Mais, class methods
doit être appelé sur la classe elle-même:
[MyClass classMethod];
Ou:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
Cela ne fonctionnera pas:
// Error
[myClass classMethod];
// Error
[self classMethod];
Une méthode de classe crée généralement une nouvelle instance de la classe ou récupère des propriétés globales de la classe. Les méthodes de classe ne fonctionnent pas sur une instance ou n'ont aucun accès à une variable d'instance.
Une méthode d'instance opère sur une instance particulière de la classe. Par exemple, la méthode des accesseurs que vous avez implémentée sont toutes des méthodes d'instance. Vous les utilisez pour définir ou obtenir les variables d'instance d'un objet particulier.
Pour appeler une méthode d'instance, vous envoyez le message à une instance de la classe.
Pour appeler une méthode de classe, vous envoyez le message directement à la classe.
Source: IOS - Objective-C - Méthodes de classe et méthodes d'instance
méthodes de classe
sont des méthodes déclarées statiques. La méthode peut être appelée sans créer d'instance de la classe. Les méthodes de classe ne peuvent fonctionner que sur les membres de la classe et non sur les membres de l'instance, car elles ne sont pas connues des membres de l'instance. Les méthodes d'instance de la classe ne peuvent également pas être appelées à partir d'une méthode de classe, sauf si elles sont appelées sur une instance de cette classe.
méthodes d'instance
d'autre part, il faut qu'une instance de la classe existe avant de pouvoir être appelée. Il faut donc créer une instance d'une classe à l'aide du nouveau mot-clé. Les méthodes d'instance fonctionnent sur des instances spécifiques de classes. Les méthodes d'instance ne sont pas déclarées comme statiques.
Prenons par exemple un jeu qui génère beaucoup de voitures. Chacune appartient à la classe CCar. Quand une voiture est instanciée, elle appelle
[CCar registerCar:self]
Ainsi, la classe CCar peut faire une liste de chaque CCar instanciée. Supposons que l'utilisateur termine un niveau et qu'il veuille supprimer toutes les voitures ... Vous pouvez soit: 1- Parcourir la liste de tous les CCar créés manuellement et faire whicheverCar.remove();
ou 2- Ajouter une méthode removeAllCars à CCar, ce qui cela pour vous lorsque vous appelez [CCar removeAllCars]. C'est à dire. allCars[n].remove();
Ou, par exemple, vous autorisez l'utilisateur à spécifier une taille de police par défaut pour l'ensemble de l'application, qui est chargée et enregistrée au démarrage. Sans la méthode de classe, vous pourriez avoir à faire quelque chose comme
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
Avec la méthode class, vous pourriez vous en sortir avec [FontHandler getDefaultFontSize]
.
En ce qui concerne votre fonction removeVowels, vous constaterez que des langages tels que C # utilisent les deux méthodes avec certaines méthodes telles que toLower ou toUpper.
par exemple. myString.removeVowels()
et String.removeVowels(myString)
(dans ObjC, ce serait [String removeVowels:myString]
).
Dans ce cas, l'instance appelle probablement la méthode class, de sorte que les deux sont disponibles. c'est à dire.
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
myString.toLower()
appelle [String toLower:ownValue]
Il n'y a pas de réponse définitive, mais si vous souhaitez intégrer une méthode de classe, cela améliorerait votre code, essayez-le et gardez à l'esprit qu'une méthode de classe ne vous permettra d'utiliser que d'autres méthodes/variables de classe.
Les méthodes de classe ne peuvent pas changer ou connaître la valeur d'une variable d'instance. Ce devrait être le critère pour savoir si une méthode d'instance peut être une méthode de classe.
Une mise à jour des réponses ci-dessus, je conviens que les méthodes d'instance utilisent une instance d'une classe, alors qu'une méthode de classe peut être utilisée uniquement avec le nom de la classe.
Il n'y a plus aucune différence entre la méthode d'instance et la méthode de classe après le comptage automatique des références dans Objective-C.
Pour Example[NS StringWithformat:..]
une méthode de classe & [[NSString alloc] initwihtformat:..]
une méthode d'instance, les deux sont identiques après ARC.
Rappelez-vous également, la même idée s'applique aux variables. Vous rencontrerez des termes tels que statique, membre, instance, classe, etc. lorsque vous parlez de variables de la même manière que vous le feriez pour méthodes/fonctions.
Il semble que le terme courant dans la communauté Obj-C soit ivar par exemple, mais je ne suis pas encore un gars d'Obj-C.
Note: Ceci est uniquement au format pseudo-code
Méthode de classe
Presque tout ce qu’il a à faire est de compiler . Il ne nécessite aucune entrée d'utilisateur, et son calcul n'est basé sur une instance. Tout repose sur la classe/modèle - ce qui est unique, c’est-à-dire que vous n’avez pas plusieurs modèles pour une classe. Pouvez-vous avoir différentes variations pendant le temps de compilation? Non, donc la classe est unique et quel que soit le nombre de fois que vous appelez une méthode de classe, le pointeur sur lequel elle pointe sera le même.
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
méthode d'instance
Au contraire, la méthode d’instance se produit pendant l’exécution, car c’est alors seulement que vous avez créé une instance de quelque chose qui peut varier à chaque instanciation.
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.
Si vous venez d'autres langues, les méthodes statiques sont identiques aux méthodes de classe.
Si vous venez de Swift, les méthodes de type sont les mêmes que les méthodes de classe.
Ajouter aux réponses ci-dessus
Méthode de classe travaillera sur la classe, nous l'utiliserons à des fins générales où, comme + stringWithFormat, la taille de la classe et surtout pour init etc.
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
Méthode d'instance travaillera sur une instance d'une classe et non sur une classe comme si nous avions deux personnes et que nous voulons connaître le solde de chaque classe séparément, nous devons utiliser la méthode d'instance. Parce que ça ne retournera pas de réponse générale. par exemple. comme déterminer le nombre de NSSArray etc.
[johnson getAccountBalance];
[ankit getAccountBalance];