Question Quelle est la différence entre les méthodes de classe et d'instance?


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 à peu près tout le reste?


427
2018-06-27 20:48


origine


Réponses:


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 avec uniquement 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 ça:

[MyClass aClassMethod];

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

Certains exemples réels de méthodes de classe sont les méthodes de commodité de nombreuses classes Foundation telles que NSStringde +stringWithFormat: ou NSArrayde +arrayWithArray:. Une méthode d'instance serait NSArrayde -count méthode.


649
2018-06-27 21:19



Tous les détails techniques ont été bien couverts dans les autres réponses. Je veux juste partager une analogie simple qui, je pense, illustre bien la différence entre une classe et une instance:

enter image description here

UNE classe est comme le plan d'une maison: vous n'avez qu'un seul plan et (généralement) vous ne pouvez pas faire autant avec le plan directeur seul.

enter image description here

Un exemple (ou un objet) est le réel 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.


185
2018-05-08 08:01



Comme les autres réponses l’ont dit, les méthodes d’instance opèrent sur un objet et ont accès à ses variables d’instance, alors 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 (sauf si 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 un +, tandis que les instances commencent avec un -. 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: Âge: 0 Nombre de personnes: 2

Un autre exemple est que si vous souhaitez que l’utilisateur puisse appeler une méthode, il est parfois utile d’en faire une méthode de classe. Par exemple, si vous avez une classe appelée MathFunctions, vous pouvez le faire:

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

Ainsi, l'utilisateur appelle:

[MathFunctions square:34];

sans jamais avoir à instancier la classe!

Vous pouvez également utiliser des fonctions de classe pour renvoyer des objets auto-libérés, comme NSArray

+ (NSArray *)arrayWithObject:(id)object

Cela prend un objet, le place dans un tableau et retourne une version auto-libérée du tableau qui n'a pas besoin d'être gérée en mémoire, ce qui est idéal pour les tableaux de températures et ce qui ne l'est pas.

J'espère que vous comprenez maintenant quand et / ou pourquoi vous devriez utiliser les méthodes de classe !!


102
2018-06-27 21:57



Une méthode d'instance s'applique à une instance de la classe (c'est-à-dire un objet) alors qu'une méthode de classe s'applique à la classe elle-même.

En C #, une méthode de classe est marquée 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() { ... }
}

35
2018-06-27 20:51



Je pense que la meilleure façon de comprendre cela 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 vérifiez le alloc méthode, qui est une méthode de classe noté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 qui est unique à cette instance, plutôt qu'à la classe dans son ensemble. init par exemple (noté avec un - avant la déclaration de la 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é myString en définissant certaines propriétés sur cette instance. Notez comment le destinataire du message est une instance (objet de classe NSString).


16
2017-11-07 09:50



La réponse à votre question n'est pas spécifique à l'objectif-c, mais 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

  • Fonctionne sur les variables de classe (elles ne peuvent pas accéder aux variables d'instance)
  • Ne nécessite pas l'instanciation d'un objet à appliquer
  • Parfois, il peut y avoir une odeur de code (certaines personnes qui ne connaissent pas bien la POO utilisent comme béquille la programmation structurée dans un environnement OO)

Méthodes d'instance

  • Fonctionne sur les variables d'instance et les variables de classe
  • Doit avoir un objet instancié pour opérer

15
2018-06-27 20:57



Les méthodes de classe sont généralement utilisées pour créer des instances de cette classe

Par exemple, [NSString stringWithFormat:@"SomeParameter"]; retourne un NSString instance avec le paramètre qui lui est envoyé. Par conséquent, comme il s'agit d'une méthode Class qui renvoie un objet de ce type, il est également appelé une méthode pratique.


6
2017-11-09 06:16



Donc si je comprends bien.

UNE class La méthode n'a pas besoin que vous allouiez l'instance de cet objet pour l'utiliser / le traiter. UNE class méthode est autonome et peut fonctionner sans aucune dépendance de l'état d'un objet de cette classe. UNE class La méthode devrait allouer de la mémoire pour tous ses travaux et désallouer une fois terminé, car aucune instance de cette classe ne pourra libérer de la mémoire allouée lors des appels précédents à la méthode class.

UNE instance La méthode est juste le contraire. 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 class variable.


6
2018-05-24 01:35