Objective-C 2.0增加了特性(@property,@synthesize),
简化了我们在类中创建成员变量访问设置的过程
局限性:不支持接受额外参数的方法,比如
- (void)setTire:(Tire *) tire
atIndex:(int) index;
- (Tire *)tireAtIndex:(int)index;
特性使用的格式如下:
@property (atomic/nonatomic,readonly/readwrite,assign/retain/copy) 变量类型 memberObject;
@synthesize memberObject;
//第一类,原子性atomic(nonatomic),默认是atomic,
atomic : 读取函数为原子操作;
nonatomic : 禁止多线程,对变量进行保护;
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的
时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,
所以在IPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么
nonatomic是一个非常好的选择。
//第二类,读写属性(readwrite/readonly),默认是readwrite
readwrite : 产生setter/getter的方法;
readonly : 只产生getter的简单方法,没有setter;
//第三类,assign/retain/copy 决定了以何种方式对成员变量赋予新值,默认是assign
assign : 简单赋值,不进行retian工作,不更改引用计数(retain count),
assign一般用在Objc基础数据类型 (NSInteger,CGFloat(double),BOOL)和
C数据类型(int, float, double, char, 等等), 或对指针的弱引用
retain : 引用计数加一,setter的方法对参数进行release旧值,再retain新的值,
一般用在NSObject和其子类。
- (void)SetName:(NSString *)newName{
if(name != newName){
[name release];
name = [newName retain];
}
}
copy : 拷贝创建一个引用计数为1的新对象,类似于C语言的深复制, 一般用在NSString类。
- (NSString)title{
return [[instanceVar retain] autorelease];
}
- (void)setTitle:(NSString *)newTitle{
if (instanceVar != newTitle){
[instanceVar release];
instanceVar = [newTitle copy];
//or retain,depending on object & usage;
}
}
示例:readonly和retain结合使用场合
@property (nonatomic,readonly,retain)NSString *strName;
strName = @"newName"; //只能在类内部直接修改变量(正确)
不能在类内部或类外部使用设置函数访问变量
self.strName = @"newName";//(错误)
Person.strName = @"newName";//(错误)
self.strName = @"newName";//使用参数(@"newName")
//调用访问器方法(setName:)修改实例变量