• Objective


    前面我们学习了类方法的基本认识, 知道了在哪些场合使用类方法更好, 那么现在我们来练习一下, 设计一个我们的工具类~~

    PS: 基本上没有用到任何实例变量, 而且里面的方法都是类方法, 这样子的类我们成为工具类.


    首先我们来看一个例子:

    #import <Foundation/Foundation.h>
    
    @interface Calculator : NSObject
    - (int)sumOfNum1:(int)Num1 andNum2:(int)Num2;
    - (int)averageOfNum1:(int)Num1 andNum2:(int)Num2;
    @end
    
    @implementation Calculator
    - (int)sumOfNum1:(int)Num1 andNum2:(int)Num2
    {
        return Num1 + Num2;
    }
    - (int)averageOfNum1:(int)Num1 andNum2:(int)Num2
    {
        return (Num1 + Num2) / 2;
    }
    @end
    
    int main()
    {
        Calculator *cal = [Claculator new];
        [cal sumOfNum1:20 andNum2:30];
        return 0;
    }

    如果按照我们以前所学的知识, 我们设计类并且调用的时候必须得用上对象才可以调用, 但现在我们学会了类方法, 就可以有多一种的选择, 可以更好的提高效率了, 就像下面这样子:

    #import <Foundation/Foundation.h>
    
    @interface Calculator : NSObject
    + (int)sumOfNum1:(int)Num1 andNum2:(int)Num2;
    + (int)averageOfNum1:(int)Num1 andNum2:(int)Num2;
    @end
    
    @implementation Calculator
    + (int)sumOfNum1:(int)Num1 andNum2:(int)Num2
    {
        return Num1 + Num2;
    }
    + (int)averageOfNum1:(int)Num1 andNum2:(int)Num2
    {
        return (Num1 + Num2) / 2;
    }
    @end
    
    int main()
    {
        int a = [Calculator sumOfNum1:20 andNum2: 50];<pre name="code" class="objc">
    

        NSLog(@"a = %d", a);
    return 0;}
    
    


    编译链接运行结果:

    Cain:2.第二天 Cain$ cc 06-类方法练习和注意事项.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 18:55:06.686 a.out[15467:1681424] a = 70
    




    一样可以正常的运行~~但这里的代码还可以继续优化一下, 继续往下看:

    #import <Foundation/Foundation.h>
    
    @interface Calculator : NSObject
    + (int)sumOfNum1:(int)Num1 andNum2:(int)Num2;
    + (int)averageOfNum1:(int)Num1 andNum2:(int)Num2;
    @end
    
    @implementation Calculator
    + (int)sumOfNum1:(int)Num1 andNum2:(int)Num2
    {
        return Num1 + Num2;
    }
    + (int)averageOfNum1:(int)Num1 andNum2:(int)Num2
    {
        int sum = [Calculator sumOfNum1:Num1 andNum2:Num2];
        return sum / 2;
    }
    @end
    
    int main()
    {
        int a = [Calculator averageOfNum1:20 andNum2: 50];
        
        NSLog(@"a = %d", a);
        
        return 0;
    }

    编译链接运行结果:

    Cain:2.第二天 Cain$ cc 06-类方法练习和注意事项.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 18:58:57.313 a.out[15477:1682692] a = 35


    看到结果后, 我们知道了这样子也可以完成计算, 那原理是什么呢? 下面让我们一起来看看示意图~



    它里面的值是一层一层的往上传, 传到最上面的那个sumOfNum1方法的时候, 进行运算, 运算完之后返回再一层层的往下返回, 所以才有我们得到的结果~~






    补充知识:

    1. 在实例方法里是可以调用类方法, 并且不会发生错误, 比如:

    + (void)test
    {
        NSLog(@"1111");
    }
    - (void)test
    {
        NSLog(@"3333");
        [Preson test];
    }

    输出结果:

    Cain:2.第二天 Cain$ ./a.out 
    2015-01-17 20:31:16.434 a.out[15582:1693087] 1111
    2015-01-17 20:31:16.435 a.out[15582:1693087] 3333
    2015-01-17 20:31:16.435 a.out[15582:1693087] 1111



    2. 陷阱之一, 在类方法里, 不能调用同名的类方法, 否则会引起死循环, 比如:

    + (void)test
    {
        NSLog(@"1111");
        [Preson test];
    }
    

    由于打印的结果太多了, 这里就不复制出来了.


    3. 陷阱之二, 同样会引起死循环, 但结果不一样, 比如:

    + (void)test
    {
        [Preson test];
        NSLog(@"1111");
    }
    

    输出结果;

    Cain:2.第二天 Cain$ cc 05-类方法.m -framework Foundation
    Cain:2.第二天 Cain$ ./a.out 
    Segmentation fault: 11
    


    陷阱一由于还有事情做, 所以程序不会退出, 会一直运行, 但陷阱二并不会打印, 一到了调用的那一句代码, 就会跳回去继续调用, 所以永远都不会打印, 程序会自动终止, 并且闪退.




    好了, 这次我们就到这里, 下次我们继续~~~

  • 相关阅读:
    python学习之——pip的安装与使用
    python学习之——django环境搭建
    python学习之——eclipse+pydev 环境搭建
    linux学习之——vim简明教程
    深度公式
    带宽、延时、吞吐率、PPS
    人脸应用:人脸检测、人脸对比、五官检测、眨眼检测、活体检测、疲劳检测
    非交互式人脸活体检测(002)
    活体检测记录(001)
    Learning Generalizable and Identity-Discriminative Representations for Face Anti-Spoofing
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282852.html
Copyright © 2020-2023  润新知