28

I am trying to write a class method in Objective C. The project builds fine when I declare the method. But the build fails whenever I try to call the method. Here is my code.

Header File

#import <UIKit/UIKit.h>

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

Source File

+ (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"];
}
Sulthan
  • 128,090
  • 22
  • 218
  • 270
Stefan Bossbaly
  • 6,682
  • 9
  • 53
  • 82

4 Answers4

64

You should call it like this:

[LoginViewController md5Hash:@"Test"];

Because it's a class (LoginViewController) method and not an instance (self) method.

Community
  • 1
  • 1
MByD
  • 135,866
  • 28
  • 264
  • 277
  • 3
    Sure -- and the key is to embrace that you aren't writing Java code. Objective-C does not have static methods; it has class methods, which can be overridden and otherwise behave exactly like instance methods (where the class is an instance of the metaclass). – bbum Jul 05 '11 at 16:50
  • 12
    You should use `[[self class] md5Hash]` otherwise subclasses will have trouble if they want their overrided `md5Hash:` to be called from `login:`. – toasted_flakes Apr 10 '13 at 14:17
33

Or you could do:

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

which should be exactly the same as calling [LoginViewController md5Hash:@"Test"] directly with the class name. Remember that md5Hash is a CLASS method, not an instance one, so you can't call it in objects (instances of the class), but from the class itself.

Alejandro Iván
  • 331
  • 3
  • 2
13

you call static methods on the class, and not on the instance. So should be

- (IBAction) login: (id) sender {
        //Call the static method
        [LoginViewController md5Hash:@"Test"];
}
filipe
  • 3,370
  • 1
  • 16
  • 22
0

The + symbol indicates that you are declaring a class method. You should replace it with -. The minus sign denotes the instance method. After that you can call it with selfobject.

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

and

- (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
}
Rob
  • 415,655
  • 72
  • 787
  • 1,044
Abhigyan
  • 641
  • 10
  • 25
  • while correct, this does not answer the OP question, which is how to call static methods from an instance method of the same class (and without specifying the class name) – Victor Jalencas Feb 01 '16 at 23:25