Quelle est la différence entre les méthodes de classe et d'instance en Objective-C et quand dois-je utiliser chacune d'elles?En Objective-C, quand dois-je utiliser les méthodes de classe et quand devrais-je utiliser des méthodes d'instance?
Répondre
En utilisant l'ancienne analogie voiture fatigué ...
d'une classe Pensez comme il est une usine qui fabrique des instances de la classe. Par exemple, vous pourriez avoir une classe de voiture et vous pouvez déclarer une méthode comme:
+ carWithColor: (NSColor *) aColor;
Et cette méthode serait alors créer une nouvelle instance de voiture, définir la couleur, et le retourner:
+ carWithColor: (NSColor *) aColor
{
Car *aCar = [[[self alloc] init] autorelease];
[aCar paintWithColor: aColor];
return aCar;
}
Maintenant, cette classe Car déclarerait alors une méthode d'instance qui permet à la voiture d'être peinte. Pourquoi une méthode d'instance? Parce que chaque voiture peut avoir une couleur différente (et la couleur de la voiture serait probablement stockée dans une variable d'instance).
- (void) paintWithColor: (NSColor *) aColor
{
... do your paint stuff here ...
}
Ceci est expliqué dans la section Objects, Classes, and Messaging de la documentation Objective-C.
signatures de méthode de classe sont préfixées avec +, les méthodes d'instance avec - donc dans vos déclarations de fichiers d'en-tête ressemblerait à quelque chose comme ceci:
-(void)setAllThings:(NSArray*)things; //instance method
+(void)setAllClassThings:(NSArray*)things; //class method
Et bien sûr, les mêmes règles sont applicables lorsque vous définissez les méthodes dans le. m fichier.
instance méthodes font des choses avec cas d'une classe:
NSString *myString;
myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease];
NSLog (@"myString's length: %u", [myString length]); // instance method
classe méthodes peuvent faire choses spécifiques à la classe sans compter sur une instance d'objet, retournant souvent une instance de la class, ou un autre résultat spécifique à la classe:
NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method
Hink il peut être rare de voir des méthodes de classe qui ne renvoient pas quelque chose.
Un exemple de méthode de classe qui ne renvoie rien est '[UIView + setAnimationsEnabled:]' - c'est-à-dire qu'une méthode de classe peut appliquer des modifications à toutes les instances. –
Vous n'avez pas besoin d'implémenter les deux. L'une ou l'autre des options est disponible pour vous lors de la conception de 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 provoquer un comportement que vous souhaitez uniquement que cette instance effectue. Vous devez avoir une instance pour l'utiliser. Ceux-ci peuvent utiliser ou modifier l'état de l'instance.
// Notional instance methods
myHouse.color = blueColor;
[myCar accelerate];
speed = myCar.speed;
Une méthode de classe fonctionne sur la notion que la classe existe. Il peut être utilisé pour créer une instance ou effectuer un calcul qui ne dépend pas d'une instance. Vous pourriez avoir une classe pour l'aide mathématique personnalisée, qui contient essentiellement des fonctions.
// Notional class method uses
myString = [NSString stringWithFormat:@"&f", floatToConvert];
myResult = [MyMathHelper MyFunctionWithInput:myInput];
Ceci est un ancien article, mais comme il apparaît d'abord dans une recherche Google, j'ai pensé que je l'ajouterais.
Je ne vais pas parler de méthodes de classe utilisées comme méthodes d'usine. Je voudrais parler de leur utilisation dans les méthodes utilitaires.Vous pouvez/devez utiliser des méthodes de classe pour les méthodes d'utilitaire indépendantes de l'état. Qu'est-ce que ça veut dire? Eh bien, par exemple, si vous formatez une date de la même manière pour toutes les instances, c'est une méthode d'utilité qui devrait être une méthode de classe. Pensez à la méthode d'utilité comme un tournevis. Vous n'avez pas besoin de créer une nouvelle instance du tournevis chaque fois que vous voulez faire quelque chose avec. Le tournevis reste constant. Ainsi, par exemple, j'ai une classe qui inclut une méthode privée qui génère une chaîne de emDashes utilisée pour l'affichage de la vue. Cette méthode ne dépend pas de l'état et ne variera donc pas par instance. Pensez aux méthodes utilitaires de classe comme les constantes.
+ (NSString *)emDashString {
return @" \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014";
}
Vous pouvez appeler cette méthode générique au sein de la classe (il est privé dans mon exemple) comme ceci:
NSString *string = [[self class] emDashString ];
J'ai délibérément choisi un peu d'un exemple trivial à conduire le point à la maison. Vous ne feriez que faire de cette méthode un utilitaire de classe si vous avez besoin de cette chaîne plus d'une fois dans votre classe. Notez qu'au lieu de faire référence à la classe par son nom, je l'appelle de manière générique avec [self class] puisque cela s'appelle en interne. Si elle est exposée et que vous voulez l'appeler depuis une autre classe, vous devez vous y référer par le nom de la classe comme d'habitude.
J'aime mieux cette explication que l'idée de Factory. Après tout, une instance de voiture peut être créée en utilisant: Car * car = [[Car 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 état/état est très utile et utilise les méthodes de classe pour renvoyer des valeurs qui sont constantes. Excellente explication. –
Et je présume, il y a moins de surcharge lors de l'appel d'une méthode de classe, c'est pourquoi il est important de comprendre quand les utiliser. –
- 1. Quand utiliser les méthodes partagées dans .NET
- 2. quand et pourquoi utiliser C# méthodes accesseurs
- 3. Quand utiliser un module et quand utiliser une classe
- 4. Quand utiliser POJO et Quand utiliser SLSB
- 5. Quand/pourquoi/comment utiliser les méthodes d'instance de protocole UINavigationControllerDelegate?
- 6. Utiliser "devrait" avec les méthodes de classe?
- 7. Hibernate: Quand utiliser getSession() et quand utiliser getCurrentSession()?
- 8. Quand utiliser conserver et quand utiliser copier
- 9. Pourquoi et quand utiliser des événements?
- 10. Utiliser des décorateurs python sur les méthodes de classe et les méthodes de sous-classes
- 11. ASP.NET MVC: Combien de traitement dans la vue et quand utiliser les méthodes auxiliaires?
- 12. en PHP, quand devrais-je utiliser des méthodes statiques vs des classes abstraites?
- 13. Quand utiliser l'activateur et quand utiliser la méthode d'usine?
- 14. Quand utiliser les mises en page et quand utiliser les activités?
- 15. Différence entre les méthodes de classe et les méthodes d'instance?
- 16. Quand utiliser les classes abstraites et quand utiliser les interfaces en C#
- 17. Méthodes de classe et méthodes d'instance dans codeigniter, comment les utiliser?
- 18. Quand utiliser les documents incorporés?
- 19. Quand utiliser/proc et quand/dev
- 20. Quand utiliser AsyncOperation et AsyncOperationManager
- 21. Quand utiliser WCF et quand utiliser les services de données ADO dans les sites Web ajax?
- 22. Quand utiliser Propriétés et quand Mapper en Java?
- 23. Quand utiliser Page.DataBind() et Control.DataBind()?
- 24. scénarios quand utiliser les fermetures
- 25. Quand utiliser une variable de champ?
- 26. Pourquoi et quand utiliser des graphiques 3D?
- 27. Quand utiliser pushScene et replaceScene?
- 28. Quand utiliser plus d'activités
- 29. Pourquoi et quand utiliser LINQ?
- 30. Quand utiliser les modèles d'usine?
je sais comment ils déclarent avec sa syntaxe aussi. Mais je ne connais pas le concept derrière pourquoi nous devons implémenter la méthode de classe et la méthode d'instance? – Tirth
iHungry, pensez à quand vous n'avez pas besoin d'utiliser un objet ou de définir getter ou setters, et peut-être obtenir quelque chose dérivé sans réellement initialiser un objet, alors les méthodes de classe sont pratiques. Puisque l'allocation et l'initialisation des méthodes de classe se font en arrière-plan, vous pouvez appeler une méthode de classe et obtenir un retour sous une forme quelconque, sans initialiser l'objet et passer par le processus de douleur de alloc, init et release. Si vous remarquez dans l'en-tête par défaut d'iOS, vous remarquerez la plupart du temps les méthodes de classe vous retournent un objet. – kforkarim