類型成員
-
數(shù)據(jù)成員 data member 描述對(duì)象狀態(tài)
- 實(shí)例變量 instance variable
- 屬性 property
-
函數(shù)成員 function member 描述對(duì)象行為
- 方法 method
- 初始化器 init
- 析構(gòu)器 dealloc
認(rèn)識(shí)屬性
- 屬性表達(dá)實(shí)例狀態(tài),描述類型對(duì)外接口。相比直接訪問實(shí)例變量,屬性可以做更多的控制
- 默認(rèn)情況下,編譯器會(huì)為屬性定義propertyName自動(dòng)合成:
- 一個(gè)getter訪問器方法:parpertyName
- 一個(gè)setter訪問器方法:setPropertyName
- 一個(gè)實(shí)例變量 _propertyName
- 可自定義訪問器方法,也可更改訪問器方法名、或?qū)嵗兞棵?/li>
- 可以使用靜態(tài)全局變量(C語言)+類方法,模擬類型屬性。
@property NSString* firstName;
//自動(dòng)生成三樣?xùn)|西
/*一個(gè)實(shí)例變量
NSString* _firstName
getter訪問器方法
-(NSString*) firstName{
return _firstName;
}
setter訪問器方法
-(void)setFirstName:(NSString*)
newValue{
_firstName=newValue;
}
*/
可以使用訪問器方法和屬性表達(dá)式調(diào)用
//訪問器方法
[employee set FirstName:@"Tom"];
NSlog(@"First Name:%@",[employee firstName]);
//屬性表達(dá)式
employee.lastName=@"Chen";//相當(dāng)于[employee setLastName:@"Chen"]
NSlog(@"Last Name:%@",employee.lastName);//相當(dāng)于[employee lastName]
//推薦使用點(diǎn)表達(dá)式
//類外不可以訪問實(shí)例變量,只能訪問屬性
可以更改訪問器變量名,如
@property (getter=GivenName,setter=GivenName:) NSString* firstName;
//必要性不大,不需要自己重新定義
實(shí)例變量
- 可以定義實(shí)例變量,而不定義屬性。只有實(shí)例變量,沒有類變量。
- 如果同時(shí)定義了getter和setter訪問器方法,或者針對(duì)只讀屬性定義了getter訪問器方法,編譯器將不再合成實(shí)例變量。
- 在類外一律使用屬性來訪問,類內(nèi)大多也通過self使用屬性訪問。只有在以下情況使用實(shí)例變量來訪問:
- 初始化器 init
- 析構(gòu)器 dealloc
- 自定義訪問器方法
實(shí)例變量的生存周期
- 實(shí)例變量的存儲(chǔ):跟隨對(duì)象實(shí)例存儲(chǔ)在堆上。
- 值類型實(shí)例變量直接“內(nèi)嵌”在對(duì)象實(shí)例中。跟隨對(duì)象實(shí)例內(nèi)存釋放而被釋放。
- 引用類型實(shí)例變量通過指針“引用”堆上的引用類型實(shí)例,ARC針對(duì)引用進(jìn)行計(jì)數(shù)管理,自動(dòng)釋放引用計(jì)數(shù)為0的對(duì)象。
屬性的描述特性
-###屬性的描述特性(Attribute)可以制定屬性不同環(huán)境下的不同功能
- 讀寫屬性
-讀寫屬性 readwrite(默認(rèn))- 只讀屬性 readonly
- 多線程特性
- 原子性 atomic(默認(rèn))
- 非原子性 nonatomic
- 內(nèi)存管理特性
- ARC環(huán)境
- 強(qiáng)引用 srong (默認(rèn))
- 弱引用 weak 阻止循環(huán)引用
- 拷貝屬性 copy 創(chuàng)建獨(dú)立拷貝
- 其他情況
- retain
- assign
- unsafe_unretained
- ARC環(huán)境
@property (readonly)fullName;//聲明只讀屬性
循環(huán)引用容易導(dǎo)致內(nèi)存崩潰,在循環(huán)引用中可以使用弱引用
拷貝屬性會(huì)在引用時(shí)建立一個(gè)獨(dú)立的拷貝(新的堆)