web-dev-qa-db-fra.com

Impossible d'appeler une méthode de classe avec [self theMethod:]

J'essaie d'écrire une méthode de classe dans Objective C. Le projet se construit bien lorsque je déclare la méthode. Mais la construction échoue chaque fois que j'essaie d'appeler la méthode. Voici mon code.

En tête de fichier

#import <UIKit/UIKit.h>

@interface LoginViewController : UIViewController {
    //Declare Vars
}
- (IBAction) login: (id) sender;
+ (NSString *) md5Hash:(NSString *)str;
@end

Fichier source

+ (NSString *) md5Hash:(NSString *)str {
    const char *cStr = [str UTF8String];
    unsigned char result[16];
    CC_MD5( cStr, strlen(cStr), result );

    return [NSString stringWithFormat:
        @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
        result[0], result[1], result[2], result[3], 
        result[4], result[5], result[6], result[7],
        result[8], result[9], result[10], result[11],
        result[12], result[13], result[14], result[15]
        ];
}
- (IBAction) login: (id) sender {
        //Call the class method
        [self md5Hash:@"Test"];
}
28
Stefan Bossbaly

Vous devriez l'appeler comme ça:

[LoginViewController md5Hash:@"Test"];

Parce que c'est une méthode de classe ( LoginViewController ) et non une méthode d'instance ( self ).

64
MByD

Ou tu pourrais faire:

- (IBAction) login: (id) sender {
        //Call the static method
        [[self class] md5Hash:@"Test"];
}

ce qui devrait être exactement la même chose que d'appeler [LoginViewController md5Hash: @ "Test"] directement avec le nom de la classe. N'oubliez pas que md5Hash est une méthode CLASS, pas une instance, vous ne pouvez donc pas l'appeler dans des objets (instances de la classe), mais à partir de la classe elle-même.

34
Alejandro Iván

vous appelez des méthodes statiques sur la classe et non sur l'instance. Alors devrait être

- (IBAction) login: (id) sender {
        //Call the static method
        [LoginViewController md5Hash:@"Test"];
}
13
filipe

Le symbole + indique que vous déclarez une méthode de classe. Vous devriez le remplacer par -. Le signe moins indique la méthode de l'instance. Après cela, vous pouvez l'appeler avec selfobject.

- (NSString *) md5Hash:(NSString *)str;

et

- (NSString *) md5Hash:(NSString *)str {
    const char *cStr = [str UTF8String];
    unsigned char result[16];
    CC_MD5( cStr, strlen(cStr), result );

    return [NSString stringWithFormat:
        @"%02X%02X%02X%02X%02X%02X;...... source code continued
}
0
Abhigyan