465 votes

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?

684voto

Cory Kilger Points 9156

Comme la plupart des autres réponses ont dit, les méthodes d'instance d'utiliser une instance d'une classe, alors qu'une méthode de classe peut être utilisé avec seulement le nom de la classe. En Objective-C, ils sont définis ainsi:

@interface MyClass : NSObject

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

@end

Ils peuvent alors être utilisés comme suit:

[MyClass aClassMethod];

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

Quelques exemples du monde réel de méthodes de la classe sont les méthodes pratiques sur de nombreuses classes de base comme NSStrings' +stringWithFormat: ou NSArrays' +arrayWithArray:. Une méthode d'instance serait NSArrays' -count méthode.

196voto

Johannes Fahrenkrug Points 12795

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

enter image description here

Une classe , c'est comme le plan d'une maison: Vous n'avez qu'un plan d'action et de (généralement) vous ne pouvez pas faire grand-chose avec le plan seul.

enter image description here

Une instance (ou un objet) est la maison que vous avez construite sur le plan d'action: Vous pouvez construire un grand nombre de maisons de le même modèle. Vous pouvez ensuite peindre les murs d'une couleur différente dans chacune des maisons, comme vous pouvez le modifier indépendamment les propriétés de chaque instance d'une classe, sans affecter les autres instances.

105voto

micmoo Points 3387

Comme les autres réponses ont dit, les méthodes d'instance fonctionner sur un objet et a accès à ses variables d'instance, alors qu'une méthode de la classe fonctionne sur une classe entière et n'a pas accès à une instance particulière de variables (sauf si vous passez à l'instance en tant que paramètre).

Un bon exemple d'une méthode de classe est un contre-type de méthode, qui renvoie le nombre total d'instances d'une classe. Les méthodes de la classe de commencer avec un +, tout en instance commencent par 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

principal.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 si vous avez une méthode que vous voulez que l'utilisateur soit en mesure de les appeler, il est parfois bon d'en faire 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;
}

Donc, ensuite, l'utilisateur d'appel: [MathFunctions carré:34], sans jamais avoir à instancier la classe!

Vous pouvez également utiliser des fonctions de classe pour le retour autoreleased objets, comme les NSArray de l'

+ (NSArray *)arrayWithObject:(id)object

Que prend un objet, il met dans un tableau, et renvoie un autoreleased version du tableau qui n'a pas à être de mémoire gérés, idéal pour temperorary tableaux et de ce pas.

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

38voto

Bubbafat Points 2029

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() { ... }
}
 

16voto

Adam Waite Points 2242

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 à l'ensemble de la classe. Si vous cochez l' alloc méthode, c'est une méthode de la classe dénotée par l' + avant la déclaration de la méthode. C'est une méthode de la classe parce qu'il est appliqué à la classe de faire 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 que pour l'ensemble de la classe. init par exemple (notée avec un - avant la déclaration de la méthode), est une méthode d'instance parce que vous êtes normalement en modifiant les propriétés de cette classe après qu'il a été créé avec l' alloc.

Exemple

NSString *myString = [NSString alloc];

Vous appelez la méthode de la classe alloc afin de créer une instance de cette classe. Remarquez comment le récepteur du message est une classe.

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

Vous êtes en train de modifier l'instance de NSString appelés myString en définissant des propriétés de cette instance. Remarquez comment le récepteur du message est une instance (un objet de la classe NSString).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X