參考文章https://www.devtalking.com/articles/you-should-to-know-property/
property是聲明屬性的語(yǔ)法著摔,可以快速方便的為實(shí)例變量創(chuàng)建存取器定续,減少程序員的代碼量,使代碼更加整潔卧波。
方便的創(chuàng)建存取器
在.h文件中庇茫,我們使用@property聲明了name和damage兩個(gè)屬性螃成,與實(shí)例變量名稱相同
@interface Sword : NSObject{
NSString *name;
int damage;
}
@property NSString *name;
@property int damage;
@end
在.m文件中查坪,使用@synthesize表明編譯器自動(dòng)生成這兩個(gè)變量的存取器宁炫,生成getter和setter函數(shù)羔巢,在iOS6之后LLVM編譯器 引入了property autosynthesis(屬性自動(dòng)合成),也就是說(shuō)竿秆,編譯器會(huì)自動(dòng)為每一個(gè)@property添加@synthesis
@implementation Sword
@synthesize name;
@synthesize damage;
@end
通過(guò)上述的聲明幽钢,我們可以使用點(diǎn)或者消息的方式調(diào)用name和damage
Sword *sword = [[Sword alloc] init];
sword.name = @"霜之哀傷";
[sword setDamage:999];
省去單獨(dú)聲明實(shí)例變量
在上面的代碼中,如果使用@property聲明了屬性匪燕,系統(tǒng)會(huì)自動(dòng)生成實(shí)例變量,默認(rèn)的實(shí)例變量名稱為在屬性名前加下劃線龟再。
下面的代碼和前面的代碼效果相同尼变,不同的是系統(tǒng)自動(dòng)生成的實(shí)例變量為_(kāi)name和_damage,同時(shí)在.m文件中截碴,編譯器會(huì)自動(dòng)使用@synthesize聲明語(yǔ)句
@interface Sword : NSObject
@property NSString *name;
@property int damage;
@end
若希望修改編譯器自動(dòng)生成的實(shí)例對(duì)象名稱蛉威,可以在.m文件中寫
@synthesize name = sword_name;
總結(jié):在頭文件中,僅需要使用@property進(jìn)行屬性聲明哲虾,即可同時(shí)生成實(shí)例變量和對(duì)應(yīng)的存取器择示,若對(duì)實(shí)例對(duì)象的名稱有要求,可手動(dòng)使用@synthesize來(lái)指定生成的實(shí)例對(duì)象名稱
property的特性
在屬性聲明的時(shí)候汪诉,添加不同的特性,編譯器根據(jù)特性來(lái)實(shí)現(xiàn)getter和setter方法鱼鼓。
- assign:簡(jiǎn)單賦值该编,適用于基本數(shù)據(jù)類型
- copy:創(chuàng)建一個(gè)新對(duì)象,新對(duì)象和舊對(duì)象是兩個(gè)獨(dú)立的對(duì)象
- retain:在賦值過(guò)程中嘉赎,引用計(jì)數(shù)加1
- strong:強(qiáng)引用于樟,表示實(shí)例對(duì)象對(duì)傳入的對(duì)象有所有權(quán)關(guān)系,引用計(jì)數(shù)加1
- weak:在setter方法中隔披,對(duì)傳入的對(duì)象不進(jìn)行引用加1的操作奢米,當(dāng)該對(duì)象引用計(jì)數(shù)為0時(shí),使用weak聲明的實(shí)例對(duì)象指向nil鬓长,通常delegate和Outlet使用weak來(lái)聲明涉波。
- readonly和readwrite:屬性默認(rèn)為readwrite,即生成getter和setter方法啤覆,readonly表示只生成getter方法,可以通過(guò)setter=myGetter表示希望編譯器生成的存取器的名稱
- atomic和nonatomic:atomic表示操作是原子性的相恃,意味著只有一個(gè)線程訪問(wèn)實(shí)例變量笨觅,但會(huì)影響效率,nonatomic是非原子的杀糯,效率比atomic快苍苞,但不能保證在多線程環(huán)境下的安全性,默認(rèn)情況下倦挂,實(shí)例變量為atomic担巩,所以一般使用需要手動(dòng)聲明nonatomic特性。