Objective-c中通过属性(property)可以为类声明实例变量并实现相应的存储方法,而且比用户自己实现更简洁。
一.属性用法
用关键字property声明属性,语法形式为:@property (特性列表)类型 对象名;其中特性列表为可选项,如果无特性列表,例如,@property NSString itemName; 则默认特性为string, readwrite, nonatomic。编译器自动生成了实例变量NSString *_itemName 和存取方法- (void)setItemName:(NSString )name、- (NSString *)itemName。
表1 使用和不使用属性的两个等价类
不使用属性 | 使用属性 | |
CNTThing.h | @interface CNTThing : NSObject { NSSTring * _name; } - (void)setName:(NSString *)n; - (NSString *)name; @end | @interface CNTThing : NSObject { @property NSSTring * name; } @end |
CNTThing.m | @implementation CNTThing - (void)setName:(NSString *)n { _name = n; } - (NSString *)name { return _name; } @end | @implementation CNTThing @end |
二.使用属性应注意的问题
1.属性的特性
@property (特性1,特性2,…)对象类型 对象名字;
其中特性有nonatomic, atomic, readwrite, readonly, strong, weak, copy等,nonatomic非原子操作,常用于界面元素,不用考虑线程安全,速度快。
2.自定义存取方法
如果属性自动生成的存取方法无法满足要求可以自定义存取方法,自定义存取方法应注意一个问题,当全部的方法都自定义时,用户需显式定义属性和变量。上例中如果用户自定义了name和setName方法,则需要在CNTThing.m中添加”@synthesize name = _name;”告诉编译器创建属性和实例变量_name。用户自定义了全部的方法也意味着假设name被声明为只读(readonly)属性,用户自定义了取方法,则需用“@synthesize”告诉编译器生成对象和方法。