OC2.0中引入了特性(property),它组合了新的预编译指令和新的属性访问器语法。
1、修改特性值
@property
这是一种新的编译器功能,表示声明一个新对象的属性。在@interface中使用。
@property float age;
其声明的属性是可以直接访问的。也可以用setAge: 来设置属性。
@property预编译指令的作用是自动声明属性的setter和getter。
@synthesize age;
在实现中使用@synthesize表示清除全部setter和getter方法。在@implementation中使用。
@synthesize也是一种新的编译器功能,表示“创建该属性的访问器”。当遇到代码@synthesize age;时,编译器将输出-setAge: 和age方法的已编译的代码。
1.3、点表达式
OC2.0的特性引入了一些新的语法特性,使我们可以更容易地访问对象的属性。
点表达式(.)。如果点表达式出现在等号(=)左边,该属性名称的setter方法将被调用。如果点表达式出现在对象变量右边,则该属性名称的getter方法将被调用。
点表达式只是调用访问器方法的一种快捷方式,这种用法并没有其它神秘之处。
2、特性扩展
2.1、名称的使用
有时希望实例变量有一个名称,而公开的属性具有另一个名称。
例如,如果希望使用其它名称(如appellation)调用Car类中的实例变量name,则只需要在Car.h文件中修改该实例变量的名称。
@interface Car:NSObject{
NSString *appellation;
NSMutableArray *tires;
Engine *engine;
}
@property (copy) NSString *name;
@property (retain) Engine *engine;
//@property中可以设置变量的内存管理(retain、assign和copy)
然后修改@synthesize指令:
@synthesize name =appellation;
编译器仍将创建 setName: 和name方法,但在其实现中却使用实例变量appellation。
2.2 只读特性
可以使某个对象具有只读属性。该属性可能是一个即时计算的值,也可能是其它对象只能读却不能修改的值。可以使用@property预编译指令的更多属性编写处理这些情况的代码。
默认情况下,特性是可修改的,即可读取可写入。可以使用特性的readwrite属性(默认情况)。
使用只读属性的一个示例如下:
@interface Me: NSObject {
float showSize;
NSString *licenseNumber;
}
@property (readonly) float shoeSize;
@property (readonly) NSString *licenseNumber;
@end
当@property是只读特性时,编译器将为该属性生成一个getter方法而不生成setter方法。Me类的使用者可以调用shoeSize和licenseNumber。但不能调用setShoeSize:和setLicenseNumber:。
3、
特性不支持那些需要接受额外参数的方法。如NSMutableArray。