@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)反編譯過相關的代碼,他大致生成了五個東西:
- OBJC_IVAR_$類名$屬性名稱 :該屬性的“偏移量” (offset),這個偏移量是“硬編碼” (hardcode)蜜徽,表示該變量距離存放對象的內(nèi)存區(qū)域的起始地址有多遠祝懂。
- setter 與 getter 方法對應的實現(xiàn)函數(shù)
- ivar_list :成員變量列表
- method_list :方法列表
- prop_list :屬性列表
也就是說我們每次在增加一個屬性,系統(tǒng)都會在 ivar_list中添加一個成員變量的描述,在 method_list中增加 setter 與 getter 方法的描述,在屬性列表中增加一個屬性的描述,然后計算該屬性在對象中的偏移量,然后給出 setter 與 getter 方法對應的實現(xiàn),在 setter 方法中從偏移量的位置開始賦值,在 getter 方法中從偏移量開始取值,為了能夠讀取正確字節(jié)數(shù),系統(tǒng)對象偏移量的指針類型進行了類型強轉(zhuǎn).
摘自這里,點擊查看更多問題及答案