2010-06-30 8 views

Répondre

12

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.

-1

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.

+0

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

+1

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

0

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.

+0

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. –

0

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]; 
6

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.

+0

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. –

+0

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. –

Questions connexes