@proterty @synthesize
是為了方便開(kāi)發(fā),提高開(kāi)發(fā)效率添加的自動(dòng)生成get和set方法方法梭冠。
@property(nonatomic,copy)NSString *name;
相當(dāng)于是聲明了:
- (NSString *)name;
- (void)setName:(NSString *)str;
而@synthesize name = _name;
先去訪問(wèn)同名變量;
如果沒(méi)有定義NSString *_name;
相當(dāng)定義了先NSString *_name;
再實(shí)現(xiàn)了:
- (NSString *)name{
return _name;
} - (void)setName:(NSString *)str{
if(_name != str){
[_name release];
_name = [str retain];
}
}
當(dāng)然邪铲,如果自己本身就已經(jīng)實(shí)現(xiàn)了 - (NSString *)name;
- (void)setName:(NSString *)str;
這兩個(gè)方法疲憋,那么系統(tǒng)就不再實(shí)現(xiàn)了。
對(duì)于現(xiàn)在渺尘,如果不使用@synthesize name = _name;
也默認(rèn)是使用@synthesize name = _name;
@synthesize name挫鸽;
如果使用的是@synthesize name;
那么對(duì)于上面的變量則為生成的是name而不是_name;
相當(dāng)于是
- (NSString *)name{
return name;
} - (void)setName:(NSString *)str{
if(name != str){
[name release];
name = [str retain];
}
}
@synthesize name = testName鸥跟;
如果使用的是@synthesize name = testName丢郊;
則對(duì)于上面的變量則為生成的是testName而不是name,方法也對(duì)應(yīng)改變医咨,總之:定義的變量是根據(jù)@synthesize name = xx枫匾;來(lái)定的。
對(duì)于@property的參數(shù)
如果是使用@property(nonatomic,copy,getter=familyName)NSString *name;
則是相當(dāng)于get方法為:
- (NSString *)familyName腋逆;
而實(shí)現(xiàn)的時(shí)候則為: - (NSString *)familyName{
return name;
}
也可以使用setter=getFamilyName;不過(guò)如果同時(shí)使用getter=和setter=并且自己實(shí)現(xiàn)了相應(yīng)方法的話(huà)婿牍,必須要用@synthesize name = xx;否則會(huì)報(bào)錯(cuò)。
對(duì)于@property各參數(shù)意義如下:
readwrite: 產(chǎn)生setter\getter方法(默認(rèn)參數(shù))
readonly: 只產(chǎn)生簡(jiǎn)單的getter,沒(méi)有setter惩歉。
assign: 默認(rèn)類(lèi)型,setter方法直接賦值等脂,而不進(jìn)行retain操作(默認(rèn)參數(shù))
retain: setter方法對(duì)參數(shù)進(jìn)行release舊值,再retain新值撑蚌。
copy: setter方法進(jìn)行Copy操作上遥,與retain一樣
nonatomic: 禁止多線程,變量保護(hù)争涌,提高性能
atomic:原子性的訪問(wèn)方法(默認(rèn)參數(shù))
還有strong和weak等