【问题标题】:Cannot call a class method with [self theMethod:]无法使用 [self theMethod:] 调用类方法
【发布时间】:2011-09-28 22:59:24
【问题描述】:

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

【问题讨论】:

    标签: objective-c methods class-method


    【解决方案1】:

    你应该这样称呼它:

    [LoginViewController md5Hash:@"Test"];
    

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

    【讨论】:

    • 当然——关键是要接受你不是在编写 Java 代码。 Objective-C 没有静态方法;它有类方法,这些方法可以被覆盖,并且在其他方​​面的行为与实例方法完全相同(其中类是元类的实例)。
    • 你应该使用[[self class] md5Hash] 否则如果子类想要从login: 调用被覆盖的md5Hash: 将会遇到麻烦。
    【解决方案2】:

    或者你可以这样做:

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

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

    【讨论】:

      【解决方案3】:

      您在类上调用静态方法,而不是在实例上。应该是这样的

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 虽然正确,但这并不能回答 OP 问题,即如何从同一类的实例方法调用静态方法(并且不指定类名)
        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        相关资源
        最近更新 更多