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);
编译链接运行结果:
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
好了, 这次我们就到这里, 下次我们继续~~~