@proterty @synthesize
是为了方便开发,提高开发效率添加的自动生成get和set方法方法。
@property(nonatomic,copy)NSString *name;
相当于是声明了:
- (NSString *)name;
- (void)setName:(NSString *)str;
而@synthesize name = _name;
先去访问同名变量;
如果没有定义NSString *_name;
相当定义了先NSString *_name;
再实现了:
- (NSString *)name{
return _name;
} - (void)setName:(NSString *)str{
if(_name != str){
[_name release];
_name = [str retain];
}
}
当然,如果自己本身就已经实现了 - (NSString *)name;
- (void)setName:(NSString *)str;
这两个方法,那么系统就不再实现了。
对于现在,如果不使用@synthesize name = _name;
也默认是使用@synthesize name = _name;
@synthesize name;
如果使用的是@synthesize name;
那么对于上面的变量则为生成的是name而不是_name;
相当于是
- (NSString *)name{
return name;
} - (void)setName:(NSString *)str{
if(name != str){
[name release];
name = [str retain];
}
}
@synthesize name = testName;
如果使用的是@synthesize name = testName;
则对于上面的变量则为生成的是testName而不是name,方法也对应改变,总之:定义的变量是根据@synthesize name = xx;来定的。
对于@property的参数
如果是使用@property(nonatomic,copy,getter=familyName)NSString *name;
则是相当于get方法为:
- (NSString *)familyName;
而实现的时候则为: - (NSString *)familyName{
return name;
}
也可以使用setter=getFamilyName;不过如果同时使用getter=和setter=并且自己实现了相应方法的话,必须要用@synthesize name = xx;否则会报错。
对于@property各参数意义如下:
readwrite: 产生setter\getter方法(默认参数)
readonly: 只产生简单的getter,没有setter。
assign: 默认类型,setter方法直接赋值,而不进行retain操作(默认参数)
retain: setter方法对参数进行release旧值,再retain新值。
copy: setter方法进行Copy操作,与retain一样
nonatomic: 禁止多线程,变量保护,提高性能
atomic:原子性的访问方法(默认参数)
还有strong和weak等