Невозможно вызвать метод класса с помощью [self theMethod:] - PullRequest
28 голосов
/ 05 июля 2011

Я пытаюсь написать метод класса в Objective C. Проект строится нормально, когда я объявляю метод. Но сборка завершается неудачно, когда я пытаюсь вызвать метод. Вот мой код.

Заголовочный файл

#import <UIKit/UIKit.h>

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

Исходный файл

+ (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"];
}

Ответы [ 4 ]

64 голосов
/ 05 июля 2011

Вы должны назвать это так:

[LoginViewController md5Hash:@"Test"];

Поскольку это метод класса ( LoginViewController ), а не метод экземпляра ( self ).

34 голосов
/ 29 июля 2012

Или вы можете сделать:

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

, что должно быть точно так же, как и вызов [LoginViewController md5Hash: @ "Test"] напрямую с именем класса. Помните, что md5Hash является методом CLASS, а не экземпляром, поэтому его нельзя вызывать в объектах (экземплярах класса), но из самого класса.

13 голосов
/ 05 июля 2011

вы вызываете статические методы для класса, а не для экземпляра.Так должно быть

- (IBAction) login: (id) sender {
        //Call the static method
        [LoginViewController md5Hash:@"Test"];
}
0 голосов
/ 10 апреля 2013

Символ + указывает, что вы объявляете метод класса. Вы должны заменить его на -. Знак минус обозначает метод экземпляра. После этого вы можете вызвать его с помощью self объекта.

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

и

- (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
}
...