屬性
@property NSString *itemName
聲明一個(gè)屬性時(shí),會(huì)隱含地生成一個(gè)對(duì)應(yīng)名稱的實(shí)例變量和一對(duì)存取方法,其中實(shí)例變量會(huì)在變量名前加下劃線
{
NSString *_itemName
}
- (void) setItemName: (NSString *) name;
- (NSString *) itemName;
屬性特性
@property (nonatomic, readwrite, strong) NSString *itemName
任何屬性都有三個(gè)特性,每個(gè)特性都有多種不同的可選類型。在這些可選類型中,有一種是默認(rèn)的
1. 多線程特性:nonatomic/atomic
大多要設(shè)置為nonatomic,因?yàn)椴皇悄J(rèn)的類型,所以必須明確寫(xiě)出
@property (nonatomic) NSString *itemName
2. 讀寫(xiě)特性:readwrite(默認(rèn))/readonly
-
readwrite具備存取方法 -
readonly只具備取方法
3. 內(nèi)存管理特性:strong(默認(rèn))/weak/copy/unsafe_unretained
-
strong強(qiáng)引用類型:指針變量指向某個(gè)對(duì)象,相應(yīng)對(duì)象多一個(gè)擁有者,并且不會(huì)被程序釋放 -
weak弱引用類型:可以讓指針變量不影響其指向?qū)ο蟮膿碛姓邆€(gè)數(shù),即對(duì)象的擁有者不變化,適合解決強(qiáng)引用循環(huán)問(wèn)題(首先確定父-子關(guān)系,父對(duì)象使用強(qiáng)引用類型,子對(duì)象使用弱引用對(duì)象)
@property (nonatomic, strong) UItem *containedItem;
@property (nonatomic, weak) UItem *container;
-
unsafe_unretained類型的指針指向的對(duì)象被銷毀時(shí),指針成為空指針(弱引用類型指針指向的對(duì)象被銷毀時(shí),指針會(huì)自動(dòng)設(shè)置為nil),造成過(guò)早釋放,所以不安全。ps:是非對(duì)象屬性的默認(rèn)值 -
copy當(dāng)屬性是指向其他對(duì)象的指針,而且該對(duì)象的類有可修改的子類,如NSString/NSMutableString、NSArray/NSMutableArray,這時(shí)應(yīng)該將設(shè)置為copy
自定義(覆蓋)屬性的存取方法
- 對(duì)于
readwrite類型的屬性(readonly類推),如果只定義其中一個(gè)存(或者取)方法,則編譯器只會(huì)創(chuàng)建默認(rèn)的取方法和實(shí)例變量。 - 如果既覆蓋了存方法,又覆蓋了取方法,那么編譯器不會(huì)自動(dòng)創(chuàng)建實(shí)例變量,此時(shí)獲取不到屬性對(duì)應(yīng)的實(shí)例變量,如
_itemName,會(huì)報(bào)錯(cuò)