Objective - C基础: 第二天 - 5.类方法的练习

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

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


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




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

posted @ 2015-01-17 18:42  背着吉他去流浪  阅读(164)  评论(0编辑  收藏  举报