本文github地址 https://github.com/ICZhuang/Runtime 朋友們?nèi)绻矚g收藏即可穆壕,不建議轉(zhuǎn)載洛退,筆者會不定期update文章干奢,github 也會同步更新饺鹃,喜歡就star一下吧彼水。
Property
從代碼中看汗侵,它就是一個帶著property attribute和自帶訪問器的Ivar幸缕,類似于Ivar,Property 在Runtime中的表示則為 objc_property_t晰韵,它是一個 objc_property 結(jié)構(gòu)體的指針(筆者沒找到它的定義发乔,后續(xù)找到后補(bǔ)上,不過各位看官可以類比Ivar的訪問方法雪猪,可以猜測 objc_property 可能
長什么樣)栏尚。
諸如 nonatomic/readonly/assign/strong/weak 等這些則為property attribute。(兩個單詞皆有屬性的意思只恨,如果寫成 屬性的屬性 不免拗口译仗,在這直接寫上英文原文,下面將它們述為 attribute官觅。)
那么屬性(property)帶有的信息 有attributes纵菌、type、name休涤,當(dāng)然同時還有setter或者getter咱圆。
獲取屬性
同樣,通過class_copyPropertyList可獲取類中的屬性列表
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount);
或者直接通過屬性名獲得對應(yīng)的屬性
objc_property_t class_getProperty(Class cls, const char *name);
訪問屬性
對于屬性的結(jié)構(gòu)體objc_property_t功氨,同樣有對應(yīng)的相關(guān)字段(或者成為信息)的操作方法
1序苏、獲取name
const char *property_getName(objc_property_t property);
2、取屬性的type encoding
const char *property_getAttributes(objc_property_t property);
3捷凄、上面方法是把 attributes 以字符串返回杠览,通過下面方法可以取得 attribute 列表,進(jìn)而通過遍歷可以取得每個attribute的信息
objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount);
這里涉及到另一個結(jié)構(gòu)體objc_property_attribute_t纵势,每個 attribute 通過結(jié)構(gòu)體 objc_property_attribute_t 定義
typedef struct {
const char *name; /**< The name of the attribute */
const char *value; /**< The value of the attribute (usually empty) */
} objc_property_attribute_t;
4踱阿、通過指定一個attribute的name管钳,獲得對應(yīng)的value
char *property_copyAttributeValue(objc_property_t property, const char *attributeName);
相當(dāng)于獲得一個attribute,然后直接按結(jié)構(gòu)體訪問方法訪問它的字段值
遍歷
- (void)getProperties {
/// get properties
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList(RTModel.class, &count);
objc_property_t property;
for (int index = 0; index < count; ++index) {
property = properties[index];
printf("%s - %s\n", property_getName(property), property_getAttributes(property));
/// get attribute's name and it's value
unsigned int out_count = 0;
objc_property_attribute_t *list = property_copyAttributeList(property,&out_count);
objc_property_attribute_t attribute;
for (int i = 0; i < out_count; ++i) {
attribute = list[i];
printf("%s - %s\n", attribute.name, attribute.value);
}
}
}
Type Encoding
屬性的type encoding软舌,除了變量類型的才漆,還應(yīng)帶上各個attribute的編碼,可以說屬性的類型是由這兩者組成佛点。比如RTModel的屬性的type encodings如下
關(guān)于property attribute的編碼詳細(xì)可參閱Objective-C Runtime Programming Guide > Declared Properties
另外通過property_02的獲得attributes列表醇滥, attribute.name 和 attribute.value打印如下。如‘T’就是attribute的name字段超营,對應(yīng)的value是‘NSArray’