數(shù)據(jù)成員:屬性與實(shí)例變量

類型成員

  • 數(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
@property (readonly)fullName;//聲明只讀屬性

循環(huán)引用容易導(dǎo)致內(nèi)存崩潰,在循環(huán)引用中可以使用弱引用
拷貝屬性會(huì)在引用時(shí)建立一個(gè)獨(dú)立的拷貝(新的堆)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容