2011-07-05 24 views
27

我想在Objective C中编写一个类方法。当我声明该方法时,项目生成良好。但是,只要我尝试调用该方法,构建就会失败。这是我的代码。不能调用类方法[self theMethod:]

头文件

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

回答

62

你应该称呼它:因为它是一个类

[LoginViewController md5Hash:@"Test"]; 

LoginViewController)方法而不是实例(self)的方法。

+3

真的 - 关键是要拥抱你不编写Java代码。 Objective-C没有静态方法;它有类方法,它们可以被重写,否则就像实例方法一样(类是元类的一个实例)。 – bbum

+10

你应该使用'[[self class] md5Hash]'否则子类将会遇到麻烦,如果他们想从'login:'调用被覆盖的'md5Hash:'。 –

13

您可以在类上调用静态方法,而不是在实例上调用静态方法。所以应该是

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

或者你可以这样做:

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

这应该是完全一样的调用[LoginViewController md5Hash:@ “测试”]直接与类名。请记住,md5Hash是CLASS方法,不是实例一,所以你不能在对象(类的实例)中调用它,而是从类本身调用它。

0

+符号表示您正在声明一个类方法。您应该用-替换它。减号表示实例方法。之后,您可以使用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 
} 
+0

while correct,this does not answer the OP question,which is to call the static methods from a instance method of the class class(and without specified class name) –

相关问题