作者:反调唱唱
链接:https://www.jianshu.com/p/70c7bf99576b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
@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等
网友评论