Réponses:
+
est pour une méthode de classe et -
est pour une méthode d'instance.
Par exemple
// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end
// somewhere else:
id myArray = [NSArray array]; // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4]; // here the message is sent to myArray
// Btw, in production code one uses "NSArray *myArray" instead of only "id".
Il y a une autre question concernant la différence entre les méthodes de classe et d'instance .
@classmethod
et @method
ou deux, aussi. Pourquoi si laconique ...?
(+) pour les méthodes de classe et (-) pour la méthode d'instance,
(+) Méthodes de classe: -
Sont des méthodes déclarées 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 à moins qu'elles ne soient appelées sur une instance de cette classe.
(-) Méthodes d'instance: -
D'autre part, une instance de la classe doit exister avant de pouvoir être appelée, donc une instance d'une classe doit être créée à l'aide du mot-clé new. 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.
Comment créer?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
Comment utiliser?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
Les méthodes + sont des méthodes de classe, c'est-à-dire des méthodes qui n'ont pas accès aux propriétés d'une instance. Utilisé pour des méthodes telles que les méthodes alloc ou helper pour la classe qui ne nécessitent pas d'accès aux variables d'instance
- les méthodes sont des méthodes d'instance - se rapportent à une seule instance d'un objet. Habituellement utilisé pour la plupart des méthodes d'une classe.
Voir la spécification de langue pour plus de détails.
self
, mais plutôt la classe. Ils ne sont simplement pas associés à une instance et la recherche de méthode ne se fait pas via l'instance, mais via la classe. Pourtant, vous pouvez le faire+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
L'explication définitive d'Apple à ce sujet est ici, dans la section `` Méthodes et messagerie '':
En bref:
(la méthode peut être appelée sans qu'une instance de la classe ne soit instanciée). Donc, vous l'appelez comme ceci:
[className classMethod];
Vous devez d'abord instancier un objet, puis vous pouvez appeler la méthode sur l'objet). Vous pouvez instancier manuellement un objet comme celui-ci:
SomeClass* myInstance = [[SomeClass alloc] init];
(cela alloue essentiellement de l'espace mémoire pour l'objet, puis initialise l'objet dans cet espace - une simplification excessive mais une bonne façon d'y penser. Vous pouvez allouer et initialiser l'objet séparément mais ne le faites jamais - cela peut conduire à des problèmes désagréables liés aux pointeurs et gestion de la mémoire)
Appelez ensuite la méthode d'instance:
[myInstance instanceMethod]
Une autre façon d'obtenir une instance d'un objet en Objective C est comme ceci:
NSNumber *myNumber = [NSNumber numberWithInt:123];
qui appelle la méthode de classe 'numberWithInt' de la classe NSNumber, qui est une méthode 'factory' (c'est-à-dire une méthode qui vous fournit une 'instance prête à l'emploi' d'un objet).
Objective C permet également la création de certaines instances d'objet directement en utilisant une syntaxe spéciale, comme dans le cas d'une chaîne comme celle-ci:
NSString * myStringInstance = @ "abc";