self.var 通過訪問方法的引用(包括set和get方法)
_var 直接引用(不通過set和get方法)
@interface User : NSObject
@property (nonatomic, assign) NSInteger age;
@end
@implementation User
@synthesize age; //LLVM 4.0之后這一行可以省略锣尉,編譯器會(huì)自動(dòng)生成刻炒,@synthesize會(huì)自動(dòng)生成set和get方法,但當(dāng)你不 需要編譯器做這些的時(shí)候自沧,可以使用@dynamic
@end
這段代碼會(huì)被編譯器解釋為:
@interface User : NSObject{
NSInteger age; //實(shí)例變量
}
@end
@implementation User
-(void)setAge:(NSInteger)newAge{
age=newAge;
}
-(void)age{
return age;
}
@end
如果同時(shí)添加了實(shí)例變量(iva)和屬性(property)會(huì)怎么樣呢坟奥?如果這個(gè)變量有相同的變量名和類型树瞭,編譯器將直接使用它而不是產(chǎn)生一個(gè)新的變量。
對(duì)于modern runtime來說爱谁,實(shí)例變量在需要的時(shí)候生成晒喷。如果已經(jīng)存在一個(gè)同名的實(shí)例變量,這個(gè)已經(jīng)存在的變量就會(huì)被使用访敌。
對(duì)于legacy runtime來說凉敲,實(shí)例變量必須已經(jīng)在當(dāng)前類的聲明中聲明過。如果一個(gè)同名實(shí)例變量作為屬性存在并且它的類型和屬性的類型兼容寺旺,這個(gè)同名實(shí)例變量將被使用爷抓,否則將發(fā)生編譯錯(cuò)誤。
如果要支持Legacy runtime阻塑,必須提供一個(gè)同名并且和屬性類型兼容的實(shí)例變量或者在@synthesize語句里面指定另外一個(gè)已經(jīng)存在的實(shí)例變量蓝撇。**
沒用下劃線的legacy代碼:
@interface User : NSObject {
NSInteger age;
}
@property (nonatomic, assign) NSInteger age;
@end
@implementation User
@synthesize age;
@end
使用下劃線規(guī)則:
@interface User : NSObject {
NSInteger _age;
}
@property (nonatomic, assign) NSInteger age;
@end
@implementation User
@synthesize age = _age;
@end
注:
Modern Runtime運(yùn)行在大多數(shù)現(xiàn)在平臺(tái)和體系結(jié)構(gòu)中,他是Apple幾年前開始64bits開發(fā)的時(shí)候重新編寫的陈莽。Legacy Runtime是NextStep1990時(shí)代的產(chǎn)物唉地。Legacy Runtime因?yàn)?進(jìn)制兼容問題而無法支持一些特性,而Mordern Runtime的設(shè)計(jì)目標(biāo)就是支持這些特性传透。
Legacy Runtime在32-bit MacOS以及32-bit上的iPhone模擬器上運(yùn)行著耘沼。Modern Runtime運(yùn)行在64-bit MacOS,iPhone Device以及64-bits下的iPhone Simulator上朱盐。對(duì)于雪豹上面的iOS開發(fā)者群嗤,他們不用再擔(dān)心模擬器和真機(jī)跑在不同的Runtime下,真對(duì)于iOS開發(fā)者來說的一個(gè)重大意義是:你現(xiàn)在可以生成一個(gè)應(yīng)用程序兵琳,然后同時(shí)運(yùn)行在不同iPhone Simulator下面(細(xì)心的用戶可能會(huì)注意到狂秘,iOS S4開始,編譯一個(gè)版本后躯肌,要切換不同device的模擬器并不需要重新編譯代碼了)