2011-09-02 3 views
25

Existe-t-il un moyen d'appeler une méthode de classe à partir d'une autre méthode dans la même classe?Appel d'une méthode de classe à partir de cette classe

Par exemple:

+classMethodA{ 
} 

+classMethodB{ 
    //I would like to call classMethodA here 
} 
+0

Tout d'abord nous dire comment envoyer un message à la méthode? Pas comment appeler une méthode? C'est une façon de le dire dans obj-c. – doNotCheckMyBlog

+0

L'avez-vous essayé? Qu'est-il arrivé? –

+0

@Craftero ne voulez-vous pas envoyer un message à un objet? Les messages ne sont pas envoyés aux méthodes. –

Répondre

8

doit être aussi simple que:

[MyClass classMethodA]; 

Si ce ne fonctionne pas, assurez-vous que vous avez la signature de la méthode définie dans l'interface de la classe. (Habituellement dans un fichier .h)

+1

C'est une façon de le faire; cependant, cela ne respectera pas le sous-classement. Dans la plupart des cas, il est probablement plus sage d'utiliser [self classMethodA]. Comme je le comprends dans une méthode de classe "self" serait l'objet de classe (parce que les méthodes de classe sont des méthodes d'instance d'une classe). Donc la méthode de MyClass serait appelée mais pas classMethodA de MyClassSubclass – csga5000

+0

Notez également qu'il a dit dans la question "dans la même classe" – csga5000

3

Bien sûr.

Supposons que vous avez ces méthodes définies:

@interface MDPerson : NSObject { 
    NSString *firstName; 
    NSString *lastName; 

} 

+ (id)person; 
+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 
- (id)initWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 


@property (copy) NSString *firstName; 
@property (copy) NSString *lastName; 

@end 

Les 2 méthodes de première classe peuvent être mises en œuvre comme suit:

+ (id)person { 
    return [[self class] personWithFirstName:@"John" lastName:@"Doe"]; 
} 

+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast { 
    return [[[[self class] alloc] initWithFirstName:aFirst lastName:aLast] 
                 autorelease]; 
} 
59

Dans une méthode de classe, self fait référence à la classe étant messaged. Donc, à partir d'une autre méthode de classe (disons classMethodB), utilisez:

+ (void)classMethodB 
{ 
    // ... 
    [self classMethodA]; 
    // ... 
} 

A partir d'une méthode d'instance (par exemple instanceMethodB), utilisez:

- (void)instanceMethodB 
{ 
    // ... 
    [[self class] classMethodA]; 
    // ... 
} 

Notez que ni presumes quelle classe vous êtes messagerie. La classe réelle peut être une sous-classe.

+1

Vous avez changé votre terminologie. '[self foo]' pour les méthodes par exemple, '[MyClass bar]' pour les méthodes de classe. –

+8

Non. La signification de 'self' dépend de ce que vous envoyez. Si vous envoyez un message à une classe, 'self' est la classe. Si vous envoyez un message à une instance, 'self' est l'instance. J'explique l'importance de la messagerie personnelle pour les méthodes de classe dans http://qualitycoding.org/factory-method/ –

+0

D'accord, ce que vous dites dans votre commentaire est vrai, mais la terminologie dans votre réponse est littéralement à l'envers. Utiliser '[self class]' dans une méthode d'instance n'a pas beaucoup de sens, mais cela prend tout son sens dans une méthode de classe. Rappelez-vous que les méthodes d'instance commencent par '-', les méthodes de classe commencent par' + ', et utiliser' self' pour désigner une instance d'un objet a une signification syntaxique mais utilise '[self class]' pour faire référence à une instance d'un objet n'a aucun sens syntaxiquement. '[self class]' implique une référence à un objet qui décrit la classe, et non une instance de la classe. –

4

Dans l'objectif C 'self' est utilisé pour appeler d'autres méthodes dans la même classe.

donc il vous suffit d'écrire

+classMethodB{ 
    [self classMethodA]; 
} 
+1

'self' est seulement approprié pour les méthodes d'exemple, mais la question suggère qu'il parle à propos des méthodes de classe (avec le signe '+' avant le nom de la méthode) –

Questions connexes