OC学习笔记九 类方法

在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;
}



总结

方法名 声明方式 调用方式 成员变量访问 调用对象方法 调用类方法
对象方法 -开头 对象调用 可以访问 直接调用 直接调用
类方法 +开头 类调用 不能访问 不能直接调用 直接调用

类方法的优点:

  1. 不依赖于类

  2. 执行效率高


类方法运用场景:

  1. 不需要使用成员变量的方法

  2. 用于编写工具方法


你可能感兴趣的:(OC学习笔记九 类方法)