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) tandis que les méthodes de classe sont à peu près tout le reste?
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) tandis que les méthodes de classe sont à peu près tout le reste?
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.
la source
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:main.m:
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:
Alors, l'utilisateur appellerait:
sans jamais avoir à instancier la classe!
Vous pouvez également utiliser des fonctions de classe pour renvoyer des objets libérés automatiquement, comme NSArray
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 !!
la source
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.
la source
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
la source
Je pense que la meilleure façon de comprendre cela est de regarder
alloc
etinit
. 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 avecalloc
.Exemple
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.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 classeNSString
).la source
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 doncalloc
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 uneNSString
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é.la source
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. Uneclass
méthode est autonome et peut fonctionner sans aucune dépendance de l'état d'un objet de cette classe. Uneclass
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.la source
Les méthodes d'instances fonctionnent sur les instances de classes (c'est-à-dire les "objets"). Les méthodes de classe sont associées aux classes (la plupart des langues utilisent le mot-clé
static
pour ces gars-là).la source
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
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 à direallCars[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
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()
etString.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
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.
la source
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.
la source
Dans Objective-C, toutes les méthodes commencent par un caractère "-" ou "+". Exemple:
Les caractères "+" et "-" spécifient si une méthode est respectivement a
class method
ou ainstance 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:A l'intérieur d'
MyClass
autres méthodes peuvent appeler des méthodes d'instance enMyClass
utilisantself
:Mais,
class methods
doit être appelé sur la classe elle-même:Ou:
Cela ne fonctionnera pas:
la source
MÉTHODES DE CLASSE
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.
MÉTHODES 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.
INVOQUER
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
la source
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.
la source
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.
la source
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 ARCla source
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.
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.
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.
la source
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
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.
la source