当编译器遇到属性声明时(参见The Objective-C 编程语言中的声明属性),它生成与封闭类、分类或协议相关的描述性元数据。可以通过函数访问元数据,该函数支持通过类或协议名称查找属性,获取属性的类型作为@encode 字符串,并复制property的属性列表作为C字符串数组。声明的属性列表可用于每个类和协议。
属性类型和函数
属性结构为属性描述符定义了一个不透明句柄。
<pre><code>
typedef struct objc_property *Property;
</pre></code>
可以使用class_copyPropertyList 和 protocol_copyPropertyList 函数分别检索属性数组和类(包括加载的类别)和协议:
<pre><code>
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
</pre></code>
例如,类声明如下:
<pre><code>
@interface Lender : NSObject {
float alone;
}
@property float alone;
@end
</pre></code>
使用如下代码,可以得到属性列表:
<pre><code>
id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
</pre></code>
可以使用property_getName函数来找到属性名称:
<pre><code>
const char *property_getName(objc_property_t property)
</pre></code>
可以使用class_getProperty和protocol_getProperty函数分别获取类和协议中给定名称的属性的引用:
<pre><code>
objc_property_t class_getProperty(Class cls, const char *name)
objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL
isRequiredProperty, BOOL isInstanceProperty)
</pre></code>
可以使用property_getAttributes 函数获取属性的名称和@encode类型字符串。编码类型字符串详情可查看类型编码(Type Encodings);字符串详情可查看属性类型字符串和property属性描述例子。
<pre><code>
const char *property_getAttributes(objc_property_t property)
</pre></code>
把这些放在一起,使用如下代码,可以打印所有与类关联的属性列表:
<pre><code>
id LenderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
fprintf(stdout, "%s %s\\n", property_getName(property),
property_getAttributes(property));
}
</pre></code>
属性类型字符串
可以使用property_getAttributes函数来获取名字,property的@encode类型字符串和其他property的属性。
该字符串以T开头,随后是@encode 类型和逗号,最后是V和实例变量名称。在这之间,用以下描述符来指定属性,并用逗号分隔:
更多例子,可查看property属性描述示例。
property属性描述示例给出以下定义:
<pre><code>
enum FooManChu { FOO, MAN, CHU };
struct YorkshireTeaStruct { int pot; char lady; };
typedef struct YorkshireTeaStruct YorkshireTeaStructType;
union MoneyUnion { float alone; double down; };
</pre></code>
下面的表格显示了属性声明和property_getAttributes返回的相应字符串: