2011-07-05 45 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) –

相關問題