前言
關(guān)于property的本質(zhì)是啥?作者原來(lái)也不知道,往下看!
正文
@property = ivar + getter + setter;
ivar是實(shí)例變量片林,getter和setter是存取方法
每一個(gè)property系統(tǒng)會(huì)生成一個(gè)相對(duì)應(yīng)的實(shí)例變量,如下列代碼
`Objective-C
@interface Person : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end
等效于下列代碼
```Objective-C
@interface Person : NSObject
- (NSString *)firstName;
- (void)setFirstName:(NSString *)firstName;
- (NSString *)lastName;
- (void)setLastName:(NSString *)lastName;
@end
property在runtime中是`objc_property_t`定義如下:
```objective-c
typedef struct objc_property *objc_property_t;
而`objc_property`是一個(gè)結(jié)構(gòu)體怀骤,包括name和attributes费封,定義如下:
```objective-c
struct property_t {
? ? const char *name;
? ? const char *attributes;
};
例如:我們定義一個(gè)string的property`@property (nonatomic, copy) NSString *string;`,通過(guò) `property_getAttributes(property)`獲取到attributes并打印出來(lái)之后的結(jié)果為`T@"NSString",C,N,V_string`晒喷,通過(guò)property_getName的得到的名字就是string孝偎。
看下圖代碼:
控制器有兩個(gè)屬性string和string2
class_copyPropertyList得到ViewController控制器的成員屬性列表,遍歷列表凉敲,通過(guò)property_getName和property_getAttributes分別得到成員屬性的名字和屬性。打印結(jié)果如下:
其中T就代表類型寺旺,C就代表Copy爷抓,N代表nonatomic,V就代表對(duì)于的實(shí)例變量阻塑。
另外我們看蓝撇,我們定義了實(shí)例變量_string,把實(shí)例變量賦值為@"abc",再打印屬性self.string,發(fā)現(xiàn)是同一個(gè)值,說(shuō)明他兩指向同一個(gè)對(duì)象陈莽。
另外關(guān)于屬性的修飾符渤昌,參考如下表:
另外在T類型后面可能會(huì)跟有q、d走搁、b等符號(hào)独柑,參考如下表:
好了,本篇就介紹到這里私植。
另外忌栅,作者最近學(xué)習(xí)了一句話覺(jué)得挺有道理:物來(lái)順應(yīng),未來(lái)不迎曲稼,當(dāng)時(shí)不忘索绪,既過(guò)不戀。共勉F肚摹H鹎!