Objectice-C之属性
属性通过所谓的访问器方法,即访问信息的方法,将类变量和方法公开给外部使用(getter ,setter)。使用属性比使用手动构建的方法更有优势,包括点表示法和内存管理。
@interface Car : NSObject
{
int year; //类变量
NSString *make;
NSString *model;
NSArray *colors;
}
这样只是申明了类的变量,不是类的属性。此时不能通过点表示法来访问,即car.make是错误的。
将上面的类变量设置为属性:
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
int year;
NSString *make;
NSString *model;
NSArray *colors;
}
@property int year; //将类变量申明为属性
@property (retain) NSString *make;
@property (retain) NSString *model;
@property (retain) NSArray *colors;
@property (readonly) NSString *carInfo;
@end
并且,在类实现文件中合成属性:
@synthesize make;
@synthesize model;
@synthesize year;
@synthesize colors;
此时,点表示法和内存管理的优势就体现出来了。
点表示法:
[NSString stringWithFormat:@"Car Info\nMake: %@\nModel: %@\nYear: %d", self.make, self.model, self.year];
内存管理:
属性简化了内存管理,你可以创建在对象整个生命周期内自动保留实例变量的属性,然后当你把这些变量设为空值时就释放这些对象。
对于属性,不要直接发送release给已保留的属性,应该如下这样的方式:
self.make = nil;
self.model = nil;
属性的特性:
readwrite 读写
readonly 只读
assgin 原子的
retain 已保留的
@property NSString *name;
上面这种方式默认使用了assgin属性特性
@property (retain) NSString *name;
属性特性设为retain实现了两个功能。首先,它保留了赋值时传递的对象。其次,它在进行新的赋值之前释放以前的值。
copy 使用它将发送一条复制的消息给被传递的对象,保留它,并释放任何以前的值。
nonatomic 非原子性
非原子性可以加快访问速度,但当两个竞争线程同时尝试修改同一个属性时就会出现问题。