7.2 合成存取器方法

从Objective-C 2.0开始,可自动生成设置函数方法和获取函数方法(统称为存取器方法)。我们到目前为止都没有介绍如何实现,原因是知道如何自己编写这些方法非常重要。然而,该语言提供了一个很方便的功能,所以现在应该学习如何充分利用这个功能了。

第一步是在接口部分中使用@property指令标识属性。这些属性通常是实例变量。在Fraction类中,两个实例变量numerator和denominator都属于此类属性。下面是新的接口部分,其中添加了新的@property指令。


@interface Fraction:NSObject

{

int numerator;

int denominator;

}

@property int numerator, denominator;

-(void)print;

-(double)convertToNum;

@end


注意,我们没有包括下列设置函数方法和获取函数方法的定义:numerator、denominator、setNumerator:和setDenominator:。我们要让Objective-C 2.0编译器为我们自动生成或合成这些方法。如何完成呢?只需在实现部分中使用@synthesize指令即可,如下所示。


import“Fraction.h”

@implementation Fraction

@synthesize numerator, denominator;

-(void)print

{

NSLog(@“i/%i”,numerator, denominator);

}

-(double)convertToNum

{

if(denominator!=0)

return(double)numerator/denominator;

else

return 1.0;

}

@end


下面这行内容告诉Objective-C编译器,为两个实例变量(numerator和denominator)的每一个生成一对设置函数方法和获取函数方法:


@synthesize numerator, denominator;


通常,如果有称为X的实例变量,那么在实现部分包括以下行会导致编译器自动实现一个获取函数方法X和一个设置函数方法setX:


@synthesize x;


即使此处看起来并非什么大事,但是让编译器完成这项工作是值得的,因为生成的存取器方法是高效的,并且在使用多个核心的多台机器上,使用多线程时也可正常运行。

现在回到代码清单7-1并按照上述内容对接口和实现部分进行更改,为你合成存取器方法。确定最终的输出与没有任何变化的FractionTest.m是相同的。