标签:des c style class blog code
Objective-C中的属性(property)
下面我们来比较下面的代码
//第一种声明方法 -(void)setRainHandling:(float) rainHanding; -(float) rainHandling; -(void)setSnowHandling:(float) snowHandling; -(float) snowHandling; //第二种声明方法 @property float rainHandling; @property float snowHandling;
以上两段代码的作用是完全一样的,由此我们可以得出属性的作用是:
我们知道了函数的settter和getter方法的声明,但是如何实现呢?我们接着看
//第一种实现方法 -(void)setRainHandling:(float) rh { rainHandling =rh; } -(float) rainHandling { return rainHandling; } -(void)setSnowHandling:(float) sh { snowHandling =sh; } -(float) snowHandling { return snowHandling; } //第二种实现方法 @synthesize rainHandling; @synthesize snowHandling;
我们的目的是彻底的删除setter和getter方法,用以上的两行代码就可以完全代替。
对于synthesize这种编译器的功能有以下几点需要说明:
点表达式的妙用
属性的扩展
名称的使用
一种非常普遍的情况是属性的名称与支持属性的实例变量名称相同,不过,有时候你可能希望实例变量是一个名称,而公开的属性是另一个名称。
//头文件的定义 #import "Tire.h" //关于适应所有天气的Tire类的声明与定义 @interface AllWeatherTire : Tire { NSString *tireName; } @property float rainHanding; @property float snowHanding; //用于给我们我的轮胎起一个名字 @property (copy)NSString *name; //实现 #import "AllWeatherTire.h" @implementation AllWeatherTire @synthesize name = tireName; - (NSString*)description { NSString *desc; desc = [NSString stringWithFormat:@"AllWeatherTier:name is %@,%.1f,%.1f, %.1f, %.1f", self.name,self.pressure,self.treadDepth,self.rainHanding,self.snowHanding]; return desc; }
在这里编译器仍创建-setName:和-name方法,但在其实现代码中用的却是tireName实例变量。不过这样做的话,编译的时候将会遇到一些错误。因为我们直接访问的实例变量已经被修改了。我们可以选择用搜索并替换的name的方式来解决,也可以将实例变量的直接调用改成用访问的方法。比如在init方法中把 name =@“Car” 改成self.name =@"Car".
自己动手有时更好
@property(readonly) float bodyMassIndex; @dynamic bodyMassIndex; -(float)bodyMassIndex { /// ; } //如果调用不存在的setter和getter方法会报错。
属性的缺点
属性不是万能的,如果方法并不适合属性所胡涵盖的较小范围的话。属性只支持替代 -setBlah和-blah方法,但是不支持那些需要接收额外参数的方法。例如:car对象中tire对象的代码。
-(void)setTire:(Tire *)tire atIndex:(int)index; -(Tire *)tireAtIndex:(int)index;
属性的总结
本文主要介绍了属性。在为对象变量执行常见的操作时,利用属性可以减少需要编写以及随后需要阅读的代码数量。使用@propert预编译指令可以告诉编译器:“嘿,这个对象具有这些类型的特性” 你还可以让属性传递其他信息,比如可变性(只读或者读写)。编译器在后台会自动生成对象变量的setter和getter方法。
使用@sythesize预编译指令可以通知编译器生成访问的方法。你还可以控制由编译器生成的访问方法对哪些实例变量起作用。如果不想使用默认的行为,你完全可以编写自己的访问方法。你还可以使用@dynamic指令告诉编译器不要生成变量和代码。
尽管点表达式通常出现在有属性的代码中,但是它只是调用对象的setter和getter方法的一种便捷方式。点表达式法减少了需要键入的字符数量,而且进一步方便了曾经使用其他语言的编程人员。
Objective-C中的属性(property),布布扣,bubuko.com
标签:des c style class blog code
原文地址:http://www.cnblogs.com/xinianhao/p/3759359.html