再叙类(2)

本文深入探讨了Objective-C中方法参数的定义与使用,包括多参数方法、不带参数名的方法及类的对象作为参数的情况。同时解释了局部变量与静态变量的区别与作用,以及如何在方法中分配和返回对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具有多个参数的方法

通过列出每个连续的参数并用冒号将其连接起来,就可以定义一个接受多参数的方法,方法名就是这用冒号连接起来的参数。

选择好的方法名可以增强程序的可读性。

例如:

-(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;
}


使用alloc申请的内存空间在堆中,当方法调用完毕之后,其内存空间没有被销毁,还可以在方法外继续使用,因此这个对象可以返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值