在OC 中,通过类直接调用的方法叫类方法,类方法执行效率高,但不能访问成员变量,通常用作于 工具方法
一声明部分
@interface Calculator : NSObject { @public int _sum; int _avg; } /* 对象方法: 1.以-开头 */ -(int)sumWithNum:(int)num1 andNum:(int)num2; -(int)avgWithNum:(int)num1 andNum:(int)num2; /* 类方法: 1.以+开头 2.类方法可以和对象方法同名,系统会根据方法类型来区分 */ +(int)sumWithNum:(int)num1 andNum:(int)num2; +(int)avgWithNum:(int)num1 andNum:(int)num2; @end
二 实现部分
@implementation Calculator -(int)sumWithNum:(int)num1 andNum:(int)num2 { //对象方法可以访问成员变量 _sum = num1+num2; return _sum; } -(int)avgWithNum:(int)num1 andNum:(int)num2 { //在对象方法中,可以直接访问类方法 return [Calculator sumWithNum:num1 andNum:num2]/2; } +(int)sumWithNum:(int)num1 andNum:(int)num2 { /* 类方法如果直接访问成员变量则报 _sum = [[Calculator new] sumWithNum:num1 andNum:num2]; instance varlalbe '_sum' accessed in class method [[Calculator new] sumWithNum:num1 andNum:num2] 注意:在类方法中调用对象方法必须创建对象, 一般开发中不建议这样使用 */ return [[Calculator new] sumWithNum:num1 andNum:num2]; } +(int)avgWithNum:(int)num1 andNum:(int)num2 { return (num1+num2)/2; } @end
三 主函数
int main(int argc, const char * argv[]) { /* 对象方法: 1.通过对象调用 [[ClassName new] functionName] 2.以+开头 3.可以访问成员变量 */ Calculator *c = [Calculator new]; int _sum = [c sumWithNum:3 andNum:2]; NSLog(@"对象方法调用:sum=%d",_sum); int _avg = [c avgWithNum:4 andNum:4]; NSLog(@"对象方法调用:avg=%d",_avg); /* 类方法: 1.通过类名调用 [ClassName functionName]; 2.以+开头,其他和对象方法一样 3.执行效率高 4.不能访问成员变量 */ _sum = [Calculator sumWithNum:15 andNum:20]; NSLog(@"类方法调用:sum=%d",_sum); _avg = [Calculator avgWithNum:4 andNum:4]; NSLog(@"类方法调用:avg=%d",_avg); return 0; }
总结
方法名 | 声明方式 | 调用方式 | 成员变量访问 | 调用对象方法 | 调用类方法 |
对象方法 | -开头 | 对象调用 | 可以访问 | 直接调用 | 直接调用 |
类方法 | +开头 | 类调用 | 不能访问 | 不能直接调用 | 直接调用 |
类方法的优点:
不依赖于类
执行效率高
类方法运用场景:
不需要使用成员变量的方法
用于编写工具方法