@property 的本質(zhì)是什么丽惭?ivar、getter辈双、setter 是如何生成并添加到這個類中的

@property 的本質(zhì)是什么责掏?
@property = ivar + getter + setter;

下面解釋下:

“屬性” (property)有兩大概念:ivar(實例變量)、存取方法(access method = getter + setter)湃望。

“屬性” (property)作為 Objective-C 的一項特性换衬,主要的作用就在于封裝對象中的數(shù)據(jù)痰驱。 Objective-C 對象通常會把其所需要的數(shù)據(jù)保存為各種實例變量。實例變量一般通過“存取方法”(access method)來訪問瞳浦。其中担映,“獲取方法” (getter)用于讀取變量值,而“設置方法” (setter)用于寫入變量值叫潦。這個概念已經(jīng)定型蝇完,并且經(jīng)由“屬性”這一特性而成為 Objective-C 2.0的一部分。 而在正規(guī)的 Objective-C 編碼風格中矗蕊,存取方法有著嚴格的命名規(guī)范短蜕。 正因為有了這種嚴格的命名規(guī)范,所以 Objective-C 這門語言才能根據(jù)名稱自動創(chuàng)建出存取方法傻咖。其實也可以把屬性當做一種關鍵字朋魔,其表示:

編譯器會自動寫出一套存取方法,用以訪問給定類型中具有給定名稱的變量卿操。 所以你也可以這么說:
@property = getter + setter;

例如下面這個類:

@interface Person : NSObject

@property NSString *firstName;
@property NSString *lastName;

@end

上述代碼寫出來的類與下面這種寫法等效:

@interface Person : NSObject

- (NSString *)firstName;
- (void)setFirstName:(NSString *)firstName;
- (NSString *)lastName;
- (void)setLastName:(NSString *)lastName;

@end

ivar铺厨、getter、setter 是如何生成并添加到這個類中的?

“自動合成”( autosynthesis)

完成屬性定義后硬纤,編譯器會自動編寫訪問這些屬性所需的方法解滓,此過程叫做“自動合成”(autosynthesis)。需要強調(diào)的是筝家,這個過程由編譯 器在編譯期執(zhí)行洼裤,所以編輯器里看不到這些“合成方法”(synthesized method)的源代碼。除了生成方法代碼 getter溪王、setter 之外腮鞍,編譯器還要自動向類中添加適當類型的實例變量,并且在屬性名前面加下劃線莹菱,以此作為實例變量的名字移国。在前例中,會生成兩個實例變量道伟,其名稱分別為 _firstName與 _lastName迹缀。也可以在類的實現(xiàn)代碼里通過 @synthesize語法來指定實例變量的名字.

@implementation Person

@synthesize firstName = _myFirstName;
@synthesize lastName = _myLastName;

@end

我為了搞清屬性是怎么實現(xiàn)的,曾經(jīng)反編譯過相關的代碼,他大致生成了五個東西:

  1. OBJC_IVAR_$類名$屬性名稱 :該屬性的“偏移量” (offset),這個偏移量是“硬編碼” (hardcode)蜜徽,表示該變量距離存放對象的內(nèi)存區(qū)域的起始地址有多遠祝懂。
  2. setter 與 getter 方法對應的實現(xiàn)函數(shù)
  3. ivar_list :成員變量列表
  4. method_list :方法列表
  5. prop_list :屬性列表

也就是說我們每次在增加一個屬性,系統(tǒng)都會在 ivar_list中添加一個成員變量的描述,在 method_list中增加 setter 與 getter 方法的描述,在屬性列表中增加一個屬性的描述,然后計算該屬性在對象中的偏移量,然后給出 setter 與 getter 方法對應的實現(xiàn),在 setter 方法中從偏移量的位置開始賦值,在 getter 方法中從偏移量開始取值,為了能夠讀取正確字節(jié)數(shù),系統(tǒng)對象偏移量的指針類型進行了類型強轉(zhuǎn).
摘自這里,點擊查看更多問題及答案

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拘鞋,一起剝皮案震驚了整個濱河市砚蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盆色,老刑警劉巖灰蛙,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟剔,死亡現(xiàn)場離奇詭異,居然都是意外死亡摩梧,警方通過查閱死者的電腦和手機物延,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來障本,“玉大人,你說我怎么就攤上這事响鹃〖菟” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵买置,是天一觀的道長粪糙。 經(jīng)常有香客問我,道長忿项,這世上最難降的妖魔是什么蓉冈? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮轩触,結果婚禮上寞酿,老公的妹妹穿的比我還像新娘。我一直安慰自己脱柱,他們只是感情好伐弹,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榨为,像睡著了一般惨好。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上随闺,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天日川,我揣著相機與錄音,去河邊找鬼矩乐。 笑死龄句,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的散罕。 我是一名探鬼主播撒璧,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笨使!你這毒婦竟也來了卿樱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤硫椰,失蹤者是張志新(化名)和其女友劉穎繁调,沒想到半個月后萨蚕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蹄胰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年岳遥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裕寨。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩蓉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宾袜,到底是詐尸還是另有隱情捻艳,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布庆猫,位于F島的核電站认轨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏月培。R本人自食惡果不足惜嘁字,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杉畜。 院中可真熱鬧纪蜒,春花似錦、人聲如沸此叠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拌蜘。三九已至杆烁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間简卧,已是汗流浹背兔魂。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留举娩,地道東北人析校。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像铜涉,于是被迫代替她去往敵國和親智玻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容