参考:http://my.oschina.net/iamzkt/blog/126503
访问器(Accessor),也就是我们所知道的setter和getter方法。
访问器是很重要的技术,用来访问和设置对象的实例变量(不是对象本身,而是对象中的属性)
下面是简单访问器
//setter
-(
void
)setStuName:(NSString *)stuName
{
//_stuName 是实例变量
if
(_stuName != stuName)
{
[_stuName release];
_stuName = [stuName copy];
}
}
//getter
-(NSString *)stuName
{
return
_stuName;
}
而@property和@synthesize可以有以上作用,前者用于声明,后者用于合成访问器,结合使用就可以合成访问器了。
@interface Student : NSObject
@property (nonatomic, copy) NSString *stuName;
@end
@implementation Student
@synthesize stuName = _stuName;
@end
原子性
atomic(默认):atomic意为操作是原子的,意为着只有一个线程访问实例变量。atomic是线程安全的至少在当前线程上是安全的。它是一个默认的,但很少使用,因为比较慢,和ARM平台和内部锁机制有关。
nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问,速度比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。
访问控制器
readwrite(默认):表示同时拥有setter和getter
readonly:表示只有getter没有setter
有时候为了语意更明确可能需要自定义访问器的名字
比如:@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;
存在的副作用是KVC与KVO无法正常工作
内存管理
retain:使用了retain意味着实例变量要获取传入参数的所有权。具体表现为setter中对实例变量先release然后将参数retain之后传给它。
-(
void
)setStuName:(NSString *)stuName
{
if
(_stuName != stuName)
{
[_stuName release];
_stuName = [stuName retain];
}
}
-(
void
)setStuName:(NSString *)stuName
{
if
(_stuName != stuName)
{
[_stuName release];
_stuName = [stuName copy];
}
}