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

Ste*_*aly 28 methods objective-c class-method

我正在尝试在Objective C中编写一个类方法.当我声明方法时,项目构建正常.但是每当我尝试调用该方法时,构建都会失败.这是我的代码.

头文件

#import <UIKit/UIKit.h>

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

源文件

+ (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"];
}
Run Code Online (Sandbox Code Playgroud)

MBy*_*ByD 64

你应该这样称呼它:

[LoginViewController md5Hash:@"Test"];
Run Code Online (Sandbox Code Playgroud)

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

  • 你应该使用`[[self class] md5Hash]`否则,如果他们希望从`login:`调用`md5Hash:`,那么子类会有问题. (11认同)
  • 当然 - 关键是要接受你不是在编写Java代码.Objective-C没有静态方法; 它有类方法,可以被覆盖,并且行为与实例方法完全相同(其中类是元类的实例). (3认同)

小智 34

或者你可以这样做:

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

这应该与直接使用类名调用[LoginViewController md5Hash:@"Test"]完全相同.请记住,md5Hash是一个CLASS方法,而不是实例,所以你不能在对象(类的实例)中调用它,而是从类本身调用它.


fil*_*ipe 13

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

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