前面我们在编写的时候用到了set方法和get方法。在object-c2.0中引入了特性(property)。
在头文件中修改,用到关键字@property 可以看如下代码:
@propertyfloat rainHandling;
@propertyfloat snowHandling;
//-(void) setrainHandling:(float) rainHandling;
//-(float) rainHandling;
//
//-(void) setsnowHandling:(float) snowHandling;
//-(float) snowHandling;
将set和get方法用@property替代。实现它们的方法如下用到关键字如下@synthesize
@synthesize rainHandling;
@synthesize snowHandling;
//-(void) setrainHandling:(float)rh
//{
// rainHandling=rh;
//}
//-(float) rainHandling
//{
// return rainHandling;
//}
//-(void) setsnowHandling:(float)sh
//{
// snowHandling=sh;
//}
//-(float) snowHandling
//{
// return snowHandling;
//}
这样对比起来我们减少了不少代码,但是我们的功能仍然实现。该技术也适用于int ,char , bool , struct 类型。甚至可以去定义一个类。
@interface Car : NSObject
{
NSString *name;
Engine *engine;
NSMutableArray *tires;
}
@property (copy) NSString *name;
@property (retain) Engine *engine;
实现的如下:
@synthesize name;
@synthesize engine;
还可以设置特性的读写属性。默认情况下特性时可读写的。readwrite属性。
@property (readwrite ,copy) NSString *name;
也可设置为只读属性
@property (readonly) NSString *licenseNumber;
我们也注意到特性也不是万能的在Car类中。我们就没有tire使用特性。
特性只能替代set和get方法。但是不支持那些需要接受额外参数的方法。
点表达式的妙用。
// [tire setrainHandling:20+i];
// [tire setsnowHandling:28+i];
tire.rainHandling=20+i;
tire.snowHandling=28+i;
如果点表达式在等号的左边,表示该属性名称的set方法。反之,在等号的右边,表示该属性名称的get方法。