7.5.2 static关键字

在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值。例如


static int hitCount=0;


声明整数hitCount是一个静态变量。和其他常见局部变量不同,静态变量的初始值为0,所以前面显示的初始化是多余的。此外,它们只在程序开始执行时初始化一次,并且在多次调用方法时保存这些数值。

所以编码序列


-(void)showPage

{

static int pageCount=0;

……

++pageCount;

……

}


可能出现在一个showPage方法中,它用于记录该方法的调用次数(在这种情况下,还可能是要打印的页数)。只在程序开始时局部静态变量设置为0,并且在连续调用showPage方法时获得新值。

注意,将pageCount设置为局部静态变量和实例变量之间的区别。对于前一种情况,pageCount能记录调用showPage方法的所有对象打印页面的数目。对后一种情况,pageCount变量可以计算每个对象打印的页面数目,因为每个对象都有自己的pageCount副本。

记住只能在定义静态和局部变量的方法中访问这些变量。所以,即使静态变量pageCount,也只能在showPage函数中访问。可以将变量的声明移到所有方法声明的外部(通常放在implementation文件的开始处),这样所有方法都可以访问它们,如:


import“Printer.h”

static int pageCount;

@implementation Printer

……

@end


现在,该文件中包含的所有实例或者类方法都可以访问变量pageCount。第10章“变量和数据类型”详细地讲述了变量作用域的主题。

返回关于分数的讨论,将reduce方法的代码结合到实现文件Fraction.m中。不要忘了在接口文件Fraction.h中声明reduce方法,之后,就可以在代码清单7-4中测试这个新方法。

代码清单7-4测试文件FractionTest.m


import“Fraction.h”

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

Fraction*aFraction=[[Fraction alloc]init];

Fraction*bFraction=[[Fraction alloc]init];

[aFraction setTo:1 over:4];//set 1st fraction to 1/4

[bFraction setTo:1 over:2];//set 2nd fraction to 1/2

[aFraction print];

NSLog(@);

[bFraction print];

NSLog(@);

[aFraction add:bFraction];

//reduce the result of the addition and print the result

[aFraction reduce];

[aFraction print];

[aFraction release];

[bFraction release];

[pool drain];

return 0;

}


代码清单7-4输出


1/4

+

1/2

=

3/4


这次更好了!