Frage Kann eine Klassenmethode nicht mit [self theMethod:] aufrufen


Ich versuche, eine Klassenmethode in Objective C zu schreiben. Das Projekt wird ordnungsgemäß erstellt, wenn ich die Methode deklariere. Aber der Build schlägt fehl, wenn ich versuche, die Methode aufzurufen. Hier ist mein Code.

Header-Datei

#import <UIKit/UIKit.h>

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

Quelldatei

+ (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
2017-07-05 16:00


Ursprung


Antworten:


Sie sollten es so nennen:

[LoginViewController md5Hash:@"Test"];

Weil es eine Klasse ist (LoginViewController) Methode und keine Instanz (selbst) Methode.


64
2017-07-05 16:01



Oder Sie könnten tun:

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

Das sollte genau so sein wie der Aufruf von [LoginViewController md5Hash: @ "Test"] direkt mit dem Klassennamen. Denken Sie daran, dass md5Hash eine CLASS-Methode ist, keine Instanz, so dass Sie sie nicht in Objekten (Instanzen der Klasse), sondern in der Klasse selbst aufrufen können.


34
2017-07-29 01:18



Sie rufen statische Methoden für die Klasse und nicht für die Instanz auf. So sollte es sein

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

13
2017-07-05 16:02



Das + Das Symbol zeigt an, dass Sie eine Klassenmethode deklarieren. Sie sollten es durch ersetzen -. Das Minuszeichen kennzeichnet die Instanzmethode. Danach können Sie es anrufen selfObjekt.

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

und

- (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
2018-04-10 13:33