Réponses:
Comme la plupart des autres réponses l'ont dit, les méthodes d'instance utilisent une instance d'une classe, tandis qu'une méthode de classe peut être utilisée avec uniquement le nom de la classe. Dans Objective-C, ils sont définis ainsi:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Ils pourraient alors être utilisés ainsi:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Certains exemples réels de méthodes de classe sont les méthodes pratiques de nombreuses classes Foundation comme NSString
's +stringWithFormat:
ou NSArray
' +arrayWithArray:
. Une méthode d'instance serait NSArray
la -count
méthode de.
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:
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 grand-chose avec le plan seul.
Une instance (ou un objet ) est la maison réelle que vous construisez en fonction du plan: vous pouvez construire de nombreuses 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.
difference between class method and an instance method
;
Comme les autres réponses l'ont dit, les méthodes d'instance fonctionnent sur un objet et ont accès à ses variables d'instance, tandis qu'une méthode de classe fonctionne sur une classe dans son ensemble et n'a pas accès aux variables d'une instance particulière (sauf si vous passez l'instance en tant que paramètre).
Un bon exemple d'une 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 celles d'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
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 avez une méthode que vous souhaitez que l'utilisateur puisse appeler, 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;
}
Alors, l'utilisateur appellerait:
[MathFunctions square:34];
sans jamais avoir à instancier la classe!
Vous pouvez également utiliser des fonctions de classe pour renvoyer des objets libérés automatiquement, comme NSArray
+ (NSArray *)arrayWithObject:(id)object
Cela prend un objet, le place dans un tableau et renvoie une version libérée automatiquement du tableau qui n'a pas besoin d'être gérée en mémoire, idéale pour les tableaux temporaires et autres.
J'espère que vous comprenez maintenant quand et / ou pourquoi utiliser des 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 statiques sont des méthodes d'instance.
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
La réponse à votre question n'est pas spécifique à objective-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
Méthodes d'instance
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 la alloc
méthode, il s'agit d'une méthode de classe indiquée par +
avant la déclaration de 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 (indiqué par un -
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 qu'elle a été créée 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. Remarquez comment le destinataire du message est une instance (objet de classe NSString
).
alloc
alloue suffisamment de mémoire à l'objet, init
modifiera le contenu de ces adresses mémoire pour définir l'état de l'objet. Nous ne pouvons pas modifier un objet à moins qu'il y ait un espace pour le modifier, nous utilisons donc alloc
sur la classe qui décidera de nous donner cet espace.
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 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 son type, elle est également appelée méthode de commodité.
Donc, si je comprends bien.
Une class
méthode n'a pas besoin que vous allouiez une 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
méthode est censée allouer de la mémoire pour tout son travail et se désallouer lorsqu'elle est terminée, 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
méthode est tout le contraire. Vous ne pouvez l'appeler que si vous allouez 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).
Selon toute probabilité (sauf si vous écrivez une bibliothèque réutilisable, vous ne devriez pas avoir besoin d'une class
variable.
Prenons par exemple un jeu où beaucoup de voitures sont générées .. chacune appartient à la classe CCar. Lorsqu'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 souhaite supprimer toutes les voitures ... vous pouvez soit: 1- parcourir une liste de tous les CCar que vous avez créés manuellement, et faire whicheverCar.remove();
ou 2- ajouter une méthode removeAllCars à CCar, qui le fera 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 de classe, vous pourriez vous en tirer [FontHandler getDefaultFontSize]
.
En ce qui concerne votre fonction removeVowels, vous constaterez que des langages comme C # ont en fait les deux 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 de classe, donc 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;
}
essentiellement, les myString.toLower()
appels [String toLower:ownValue]
Il n'y a pas de réponse définitive, mais si vous avez envie de pousser une méthode de classe dans 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.
méthodes de classe
sont des méthodes qui sont déclarées comme 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 classe et non sur les membres d'instance car les méthodes de classe ne connaissent pas les membres d'instance. Les méthodes d'instance de la classe ne peuvent pas non plus ê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, donc une instance d'une classe doit être créée en utilisant le 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.
Dans 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 a class method
ou a instance method
.
La différence serait claire si nous appelions 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];
A l'intérieur d' MyClass
autres méthodes peuvent appeler des méthodes d'instance en MyClass
utilisant 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 certaines propriétés globales de la classe. Les méthodes de classe ne fonctionnent pas sur une instance ou n'ont aucun accès à la variable d'instance.
Une méthode d'instance fonctionne sur une instance particulière de la classe. Par exemple, la méthode d'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 directement le message à la classe.
Source: IOS - Objective-C - Méthodes de classe et méthodes d'instance
Les méthodes de classe ne peuvent pas modifier ou connaître la valeur d'une variable d'instance. Cela devrait être le critère pour savoir si une méthode d'instance peut être une méthode de classe.
Rappelez-vous également que la même idée s'applique aux variables. Vous rencontrerez des termes comme statique, membre, instance, classe et ainsi de suite lorsque vous parlerez de variables de la même manière que pour les méthodes / fonctions.
Il semble que le terme commun dans la communauté Obj-C soit ivar par exemple variable, mais je ne suis pas encore un gars Obj-C.
Une mise à jour des réponses ci-dessus, je conviens que les méthodes d'instance utilisent une instance d'une classe, tandis qu'une méthode de classe peut être utilisée avec uniquement le nom de la classe.
Il n'y a plus de différence entre la méthode d'instance et la méthode de classe après que le comptage automatique des références a vu le jour dans Objective-C.
Par exemple, [NS StringWithformat:..]
une méthode de classe et [[NSString alloc] initwihtformat:..]
une méthode d'instance, les deux sont identiques après ARC
Remarque: Ceci est uniquement au format pseudo-code
Méthode de classe
Presque tout ce qu'il doit faire est pendant la compilation . Il n'a besoin d'aucune entrée utilisateur, ni son calcul basé sur une instance. Tout à ce sujet est basé sur la classe / le plan - qui est unique, c'est-à-dire que vous n'avez pas plusieurs plans pour une classe. Pouvez-vous avoir différentes variations pendant la compilation? Non, par conséquent, la classe est unique et donc quel que soit le nombre de fois que vous appelez une méthode de classe, le pointeur pointant vers elle 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 seulement alors 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 langages Les méthodes statiques sont les mêmes que les méthodes de classe.
Si vous venez de Swift, les méthodes de type sont les mêmes que les méthodes de classe.
Ajout aux réponses ci-dessus
La méthode de classe fonctionnera 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];
La méthode d'instance fonctionnera sur une instance d'une classe et non sur une classe comme nous avons deux personnes et nous voulons connaître l'équilibre de chacune séparément ici, nous devons utiliser la méthode d'instance. Parce qu'il ne renverra pas de réponse générale. par exemple, comme déterminer le nombre de NSSArray, etc.
[johnson getAccountBalance];
[ankit getAccountBalance];