Objective c 无法使用[self-theMethod:]调用类方法

Objective c 无法使用[self-theMethod:]调用类方法,objective-c,methods,class-method,Objective C,Methods,Class Method,我试图在Objective C中编写一个类方法。当我声明该方法时,该项目构建得很好。但是每当我尝试调用该方法时,构建都会失败。这是我的密码 头文件 #import <UIKit/UIKit.h> @interface LoginViewController : UIViewController { //Declare Vars } - (IBAction) login: (id) sender; + (NSString *) md5Hash:(NSString *)str;

我试图在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"];
}

你应该这样称呼它:

[LoginViewController md5Hash:@"Test"];

因为它是一个类(LoginViewController)方法,而不是一个实例(self)方法。

您在类上调用静态方法,而不是在实例上调用静态方法。应该如此

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

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

这应该与直接使用类名调用[LoginViewController md5Hash:@“Test”]完全相同。请记住,md5Hash是一个类方法,而不是实例方法,因此您不能在对象(类的实例)中调用它,只能从类本身调用它。

符号
+
表示您正在声明一个类方法。您应该将其替换为
-
。减号表示实例方法。之后,您可以使用
self
对象调用它

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


当然——关键是要承认您不是在编写Java代码。Objective-C没有静态方法;它有类方法,这些方法可以被重写,否则其行为与实例方法(类是元类的实例)完全相同。您应该使用
[[self class]md5Hash]
否则子类如果希望从
登录:
调用被重写的
md5Hash:
,则会遇到问题,这并没有回答OP的问题,即如何从同一类的实例方法调用静态方法(并且不指定类名)
- (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
}