Que signifient les signes plus et moins dans Objective-C à côté d'une méthode?

180

En Objective-C, j'aimerais savoir ce que signifient les signes +et à -côté d'une définition de méthode.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
gyurisc
la source

Réponses:

226

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

Georg Schölly
la source
63
C'est presque comme si les cinq caractères supplémentaires de "statique" étaient en quelque sorte trop pour eux.
Anon.
23
@Anon: Les méthodes ne sont pas statiques. Ce sont des méthodes de classe. Ils peuvent être remplacés et font vraiment partie de la hiérarchie des classes. statique implique quelque chose de très différent dans C.
bbum
4
@Avon, c'est Apple pour vous, ils laisseront aussi un flash sur leur appareil photo, et un bouton droit sur leurs souris. =)
pokstad
13
@bbum est sur l'argent. Le fait que Java se soit réapproprié le mot-clé "static" pour signifier quelque chose de différent n'est pas la faute du bien plus ancien C. Bien que son utilisation ne soit pas entièrement intuitive en C, il le semble encore moins en Java. Je m'attendrais à ce que la statique soit le contraire de la dynamique - quelque chose qui ne change pas. Et bien sûr, le langage Objective-C existait pendant près de 15 ans avant qu'Apple ne l'adopte sous OS X.
Quinn Taylor
3
La différence entre statique et une méthode de classe: définissez la méthode + foo dans MYBaseClass et sa sous-classe MYSubClass. NSArray * classes = @ [[classe MYBaseClass], [classe MYSubClass]]; [classes makeObjectsPerformSelector: @selector (toto)]; Ne fonctionnerait pas avec une méthode statique. Cela dit, j'aurais préféré un @classmethodet @methodou deux, aussi. Pourquoi si laconique ...?
uliwitness
45

(+) 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];
Vandit Mehta
la source
18

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.

Robert Christie
la source
Eh bien, en fait, les méthodes de classe ont accès aux variables d'instance, elles n'ont tout simplement pas d'instance en tant que 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; }
uliwitness
5

L'explication définitive d'Apple à ce sujet est ici, dans la section `` Méthodes et messagerie '':

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

En bref:

+ signifie 'méthode de classe'

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


- signifie 'méthode d'instance'

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";

Chris Halcrow
la source