簡(jiǎn)單談?wù)?@synthesize
@synthesize
是編譯器自動(dòng)生成 setter/getter 方法的實(shí)現(xiàn)(實(shí)現(xiàn)實(shí)現(xiàn)實(shí)現(xiàn)很重要)的關(guān)鍵詞。當(dāng)前開發(fā)中使用了 @property
后媳禁,會(huì)在 .m 中自動(dòng)生成 @synthesize 屬性名 = _屬性名
与斤,而不是 @property
本身幫我們生成 setter/getter 方法,@property
本身只是生成 setter/getter 方法的聲明(聲明聲明聲明很重要)尼斧。
@synthesize
寫出來的代碼可能會(huì)長(zhǎng)這樣:
@synthesize boy;
@synthesize boy = boy;
@synthesize boy = _boy;
(girl是事先聲明好的一個(gè)變量)
@implementation ViewController {
NSObject *girl;
}
@synthesize boy = girl;
-
@synthesize boy = noDeclaredVar;
(noDeclaredVar是指沒有聲明過姜贡,隨便打出來的)
上述5個(gè)代碼都是能夠正常使用的⊥患眨看著有點(diǎn)繞鲁豪,新手可能看不懂這到底是干嘛的。
簡(jiǎn)單解釋下律秃,@synthesize boy
默認(rèn)等于 @synthesize boy = boy;
爬橡。那么只要理解一種:@synthesize xx = yy;
即可。這個(gè)“等式”表明“之前用@property (nonatomic, strong) NSObject *boy;
聲明的這個(gè)“屬性”在 setter/getter 方法中實(shí)際使用的實(shí)例變量是 yy
棒动,如果 yy
沒有手動(dòng)聲明糙申,那么會(huì)自動(dòng)聲明為一個(gè)實(shí)例變量。
補(bǔ)充一點(diǎn):xx 必須是用
@property
聲明過的船惨。
我們對(duì)照著上面的5個(gè)關(guān)鍵字代碼看看柜裸。
- 在
@property
聲明的boy,在 setter/getter 方法中使用NSObject *boy;
這個(gè)實(shí)例變量來賦值與返回粱锐。 - 同1疙挺。
- 在
@property
聲明的boy,在 setter/getter 方法中使用NSObject * _boy;
這個(gè)實(shí)例變量來賦值與返回怜浅。 - 在
@property
聲明的boy铐然,在 setter/getter 方法中使用NSObject *girl;
這個(gè)實(shí)例變量來賦值與返回蔬崩。 - 在
@property
聲明的boy,在 setter/getter 方法中使用NSObject * noDeclaredVar;
這個(gè)實(shí)例變量來賦值與返回搀暑。
@synthesize 使用指定的屬性實(shí)踐
@interface ViewController ()
@property (nonatomic, strong) NSObject *boy;
@end
@implementation ViewController {
NSObject *boy;
NSObject *girl;
}
@synthesize boy = girl;
- (void)viewDidLoad {
[super viewDidLoad];
self.boy = [[NSObject alloc] init];
NSLog(@"請(qǐng)問哪個(gè)孩子已經(jīng)出生了沥阳?boy : %@ girl : %@", boy, girl);
}
@end
-
@implementation
中聲明的成員屬性NSObject *boy
和@property
聲明的boy是否是同一個(gè)對(duì)象?還存不存在_boy
這個(gè)實(shí)例變量自点?不是桐罕,@synthesize已經(jīng)指定了
girl
作為 setter/getter 方法里使用的實(shí)例變量,不再自動(dòng)生成_boy
這個(gè)實(shí)例變量了桂敛。 -
@synthesize boy = girl;
到底是把 boy 變成了 girl 功炮,還是把 girl 變成了boy?沒有變來變?nèi)ゲ嚎校驗(yàn)閴焊淮嬖?
_boy
了死宣。是把boy
的 setter 方法- (void)setBoy:(NSObject *)boy
的實(shí)現(xiàn)改成了girl = boy
,即把_boy
用girl
替代碴开。已經(jīng)不存在_boy
這個(gè)成員變量了毅该。