天天看點

ios 利用runtime列印類的所有屬性 屬性聲明

1. 你可以用下面這段代碼列印一個類的屬性清單:

id tfClass = objc_getClass("userClass");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(tfClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}
           

2. 屬性類型字元串說明

你可以使用 property_getAttributes 方法來擷取屬性的名字、@encode類型字元串,以及屬性的其他屬性。

字元串以T開頭,然後是 @encode 類型和逗号,最後是V和執行個體變量的名字。在這之中,屬性由以下這些描述符指定:

你可以用 property_getAttributes 方法擷取屬性的名字和 @encode 類型的字元串。關于編碼類型字元串的細節,請參考 《類型編碼》章節,細節請參考 《屬性類型字元串》和《屬性類型描述舉例》。

const char *property_getAttributes(objc_property_t property)
1
           

你可以用方法 class_getProperty 和 protocol_getProperty 擷取一個類或協定的指定名字的屬性的引用:

objc_property_t class_getProperty(Class cls, const char *name)

objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)

           

你可以使用 property_getName 來擷取屬性名:

const char *property_getName(objc_property_t property)
           

你可以這樣擷取屬性清單:

id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
           

你可以使用 class_copyPropertyList 和 protocol_copyPropertyList 方法擷取一個類、類别或者協定的屬性清單:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
           

屬性聲明

當編譯器遇到屬性聲明(參見《The Objective-C Programming Language》中的屬性聲明),它會為這個類、類别或者協定産生一些描述性的 metadata。你可以通過一些方法通路這些metadata,這些方法能夠通過類或者協定的名字查詢屬性,擷取屬性的類型,以及拷貝屬性的屬性。屬性聲明的清單對每個類和協定都适用。

屬性類型和方法

Property 結構定義了屬性描述符的handle。

typedef struct objc_property *Property;
           

繼續閱讀