10
votes

Dans l'objectif-C, quand devrais-je utiliser des méthodes de classe et quand devrais-je utiliser des méthodes d'instance?

Quelle est la différence entre les méthodes de classe et d'instance dans l'objectif-C et quand devrais-je utiliser chacun d'eux?


0 commentaires

5 Réponses :


-1
votes

Méthode de classe Les signatures sont préfixées avec +, des méthodes d'instance avec - donc dans vos déclarations de fichiers d'en-tête ressembleraient à ceci comme suit:

-(void)setAllThings:(NSArray*)things; //instance method
+(void)setAllClassThings:(NSArray*)things; //class method


2 commentaires

Je sais comment ils déclarent que sa syntaxe aussi. Mais je ne connais pas le concept de la raison pour laquelle nous devons mettre en œuvre la méthode de classe et la méthode d'instance?


Ihungry, réfléchissez lorsque vous n'avez pas besoin d'insérer un objet, ou de définir getter ou setters, et peut-être obtenir quelque chose de dérivé sans initialiser un objet, puis les méthodes de classe sont pratiques. Étant donné que l'allocation et l'initialisation des méthodes de classe se produisent en arrière-plan, vous pouvez appeler une méthode de classe et obtenir un retour sous une forme, sans initialiser l'objet et passer à travers ce processus de douleur d'alloc, d'init et de libération. Si vous remarquez dans l'en-tête d'IOS par défaut, vous remarquerez la plupart du temps que les méthodes de classe vous rendent un objet.



12
votes

Utilisation de l'analogie de la vieille voiture fatiguée ...

Pensez à une classe comme c'est une usine qui fait des instances de la classe. Par exemple, vous pourriez avoir une classe de voiture et vous pourriez déclarer une méthode comme: p> xxx pré>

et cette méthode créerait ensuite une nouvelle instance de voiture, définir la couleur et le renvoyer : P>

- (void) paintWithColor: (NSColor *) aColor
{
    ... do your paint stuff here ...
}


0 commentaires

0
votes

instance Les méthodes sont des choses avec instances d'une classe: xxx

méthodes peuvent faire < Strong> Spécifique de classe des choses sans s'appuyer sur une instance d'objet, renvoyant souvent une instance de la classe ou un autre résultat spécifique à la classe: xxx

je pense Il peut être rare de voir des méthodes de classe qui ne renvoient pas quelque chose.


1 commentaires

Un exemple de méthode de classe qui ne renvoie rien est [uiview + SetanimationsEnabled:] - c'est-à-dire une méthode de classe peut appliquer des modifications à toutes les instances.



0
votes

Vous n'avez pas besoin de mettre en œuvre les deux. L'une des deux options est disponible lorsque vous concevez votre classe.

Une méthode d'instance peut fonctionner sur une instance de la classe. Cela peut obtenir ou définir une propriété ou causer un comportement que vous voulez seulement que cette instance se produise. Vous devez réellement avoir une instance pour l'utiliser. Ceux-ci peuvent soit utiliser ou modifier l'état de l'instance. P>

// Notional class method uses
myString = [NSString stringWithFormat:@"&f", floatToConvert];

myResult = [MyMathHelper MyFunctionWithInput:myInput];


0 commentaires

8
votes

C'est un ancien poste, mais puisqu'il s'agit d'abord dans une recherche Google, je pensais ajouter à cela.

Je ne vais pas parler de méthodes de classe utilisées comme méthodes d'usine. J'aimerais parler de leur utilisation dans les méthodes utilitaires. Vous pouvez utiliser des méthodes de classe pour les méthodes utilitaires indépendantes de l'état. Qu'est-ce que ça veut dire? Eh bien, par exemple, si vous êtes en train de formater une date de la même manière pour toutes les instances, c'est une méthode utilitaire qui devrait être une méthode de classe. Pensez à la méthode utilitaire comme un tournevis. Vous n'avez pas besoin de faire une nouvelle instance de la vis à chaque fois que vous voulez faire quelque chose avec elle. La vis reste constante. Ainsi, par exemple, j'ai une classe qui inclut une méthode privée qui génère une chaîne d'emmédiations utilisées pour afficher à la vue. Cette méthode n'est pas dépendante de l'état et ne variera pas par exemple. Pensez aux méthodes utilitaires de classe telles que les constantes. P> xxx pré>

} p>

Vous pouvez appeler cette méthode générique au sein de la classe (c'est privé dans mon exemple) comme ceci: P>

NSString *string = [[self class] emDashString ];


2 commentaires

J'aime cette explication mieux que l'idée d'usine. Après tout, une instance de voiture peut être créée en utilisant: voiture * voiture = [[voiture alloc] init]; Puis peint avec une autre méthode d'instance, donc je ne vois pas vraiment l'analogie de l'usine comme étant très utile. Mais l'idée de l'état / apatride est très utile et utilise des méthodes de classe pour renvoyer des valeurs constantes. Excellente explication.


Et je présume, il y a moins de frais généraux lorsque vous appelez une méthode de classe, c'est pourquoi il est important de comprendre quand les utiliser.