具有多个参数的方法
通过列出每个连续的参数并用冒号将其连接起来,就可以定义一个接受多参数的方法,方法名就是这用冒号连接起来的参数。
选择好的方法名可以增强程序的可读性。
例如:
-(void) setTo:(int)n over:(int)d
{
numerator=n;
denominator=d;
}
增强了程序的可读性。
不带参数名的方法
在创建方法名的时候,可以省略参数名。例如:
-(void) set : (int) n :(int ) d
这个方法的名字setTo::,有两个冒号,表示有两个参数
调用时:[aFraction set :1 :3];
这种编程风格不是好的编程风格,因为降低了程序的可读性。
类的对象做参数
当一个方法的参数为对象时,声明参数时,参数类型应为对应的类型的引用(或指针),而不是对应的参数类型。例如:
-(void) add:(Fraction *)f
{
numerator = numerator * f.denominator + denominator * f.numerator;
denominator = denominator * f.denominator;
[self reduce];
}
若改成-(void) add:(Fraction )f则是不正确的。
并且,在add:方法中,可以直接指定这个对象的实例变量并直接通过名字发送消息。但是,不可以用这种方法直接指定参数f的实例变量,而是通过名字f标识对象,然后通过运用点运算符(或者通过f向其发送相应的消息)来获得实例变量。
局部变量
现在给出如下的代码:
-(void) reduce
{
int u = numerator;
int v =denominator;
int temp;
while (v !=0) {
temp=u%v;
u=v;
v=temp;
}
numerator/=u;
denominator/=u;
}
@end
其中的三个整型变量u,v,temp是局部变量,只有在reduce运行的时候在存在,并且只有在定义他们的方法中才能访问。局部变量没有记忆力,因为局部变量储存在栈中,与实例变量不同,实例变量在多次方法调用时保持着自己的值。
方法的参数
方法的参数名也是局部变量,执行方法时,通过方法传递的任何参数都被赋值到局部变量中,因此方法使用参数的副本,不能改变方法传递的原值。
当方法的参数为对象时,可以改变实例变量的值。因为当传递一个对象做参数时,实际上是传递一个对象的指针,即一个数据存储位置的引用。
static关键字
静态变量的默认初始值为0,所以在静态变量定义时将其赋值为0是没有必要的。并且静态变量只程序开始执行时初始化一次,并且在多次调用此方法时保存这些数值。
- (int) showPage
{
static int pageCount=0;
...
++pageCount;
...
return pageCount;
}
pageCount在连续调用方法时获得新的值。
将pageCount设置为局部静态变量时,记录调用showPage的所有方法的所有对象打印页面的数目。
将pageCount设置为实例变量时,记录调用showPage的所有方法的每个对象打印页面的数目,因为每个对象都有一个pageCoun的副本。
注意:只能在定义静态变量和局部变量的方法中访问这些变量。也可以将变量的声明移到所有方法声明的外部,(通常放在implementation文件的开始处),这样所有的方法都可以访问它。例如:
#import "Printer.h"
static int pageCount
@implementation Printer
...
@end
self关键字
关键字self用来指明当前对象是当前方法的接受者,其实际是一个指针。有关与self的详细介绍,请查看《objective c的self和super详解》和《objective c关于self的用法总结》两篇文章。
方法中分配和返回对象
-(Fraction*) add :(Fraction * ) f
{
<span style="white-space:pre"> </span>Fraction *result = [ [ Fraction alloc ]init ];
<span style="white-space:pre"> </span>result .number = number * f.denominator + deniminator * f.numerator;
<span style="white-space:pre"> </span>result.denominator = deniminator + f.denominator;
<span style="white-space:pre"> </span>[result reduce];
<span style="white-space:pre"> </span>return result;
}