Objective-C2.0中引入了特性(property),它组合了新的预编译指令和新的属性访问器语法。新的特性功能显著减少了必须编写的冗长代码的数量。Objective-C的特性只适用于Leopard或更高版本。特性主要应用于Cocoa的新组件(尤其是华丽夺目的Core Animation效果)。
@property是一种新的编译器功能,表示声明了一个新对象的属性。
@property float rainHanding;语句表明这是具有float类型的属性,其名称为rainHanding。而且,你可以通过调用-setRainHanding:来设置属性,通过调用-rainHanding来访问属性。@property预编译指令的作用是自动声明属性的setter和getter方法。
接口类代码
@interface AllWeatherRadial {
float rainHanding;
}
@property float rainHanding;
...
实现类代码
@implementation AllWeatherRadial
@synthesize rainHanding;
...
@synthesize 也是一种新的编译器功能,表示“创建该属性的访问器”。当遇到代码@synthesize rainHanding;时,编译器将输出-setRainHanding:和-rainHanding方法的已编译代码。
点表达式
[tire setRainHanding:20]; 改成 tire.rainHanding = 20;
Objective-C2.0新特性,如果点表达式出现在等号左边,该属性名称的setter方法将被调用。如果点表达式出现在对象变量右边,则该属性名称的getter方法将被调用。
特性扩展
@property (copy) NSString *name;
@property (retain) Engine *engine;
copy声明,编译器和该类的使用者知道name对象将被复制。因为编程人员知道它们不需要复制从文本域获得的字符串。这样可以简化编程人员使用该类的工作。
retain声明,对engine对象的管理只胡保留和释放的操作。
nonatomic声明,如果不在多线程环境中使用,这些声明可以提高访问器方法的调用速度。iphone开发人员经常使用这种技术在资源有限的设备上获得更好的性能。如果不希望保留属性的对象,你可以使用assign方法以避免保留周期问题。
只读属性
默认情况下,特性是可修改的:即可读取又可写入。readwrite声明。
readonly声明,编译器只为该属性生成一个getter方法而不生成settter方法。调用setter方法时,编译器将会报错。