当编译器遇到属性声明(请参阅 _Objective-C _编程语言中 声明属性)时,它会生成与封闭类、类别或协议相关联的描述性元数据。您可以使用支持在类或协议上按名称查找属性、以@encode
字符串形式获取属性类型以及以C字符串数组形式复制属性属性列表的函数来访问此元数据。声明的属性列表可用于每个类和协议
。
属性类型和功能
Property
结构定义属性描述符的不透明句柄。
typedef struct objc_property *Property;
可以使用函数class_copyPropertyList
和protocol_copyPropertyList
分别检索与类
(包括加载的类别)和协议
相关联的属性数组
:
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
例如,给定以下类声明:
@interface Lender : NSObject { float alone; } @property float alone; @end
可以使用以下方法获取属性列表
:
id LenderClass = objc_getClass("Lender"); unsigned int outCount; objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
您可以使用 property_getName
函数来发现属性的名称
:
const char *property_getName(objc_property_t property)
可以使用函数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_getAttributes
函数来发现属性的名称和@encode
type字符串。有关编码类型字符串的详细信息,请参阅 类型编码;有关此字符串的详细信息,请参阅 Property Type String和 Property Attribute Description Examples。
const char *property_getAttributes(objc_property_t property)
将这些组合在一起,可以使用以下代码打印与类关联的所有属性的列表:
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)); }
属性类型字符串
可以使用property_getAttributes
函数来发现属性的名称、@encode
type字符串以及属性的其他属性。
字符串以T
开头,后跟@encode
类型和逗号
,以V
结尾,后跟支持实例变量的名称
。其中,属性由以下描述符指定,用逗号分隔:
Table 7-1 声明的属性类型编码
示例, 请参见 Property Attribute Description Examples.
Property Attribute 描述示例
根据这些定义:
enum FooManChu { FOO, MAN, CHU }; struct YorkshireTeaStruct { int pot; char lady; }; typedef struct YorkshireTeaStruct YorkshireTeaStructType; union MoneyUnion { float alone; double down; };
下表显示了示例属性声明和属性property_getAttributes
返回的相应字符串: