C运维时编制程序指南

当编译器遇到属性声明时(参见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;

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, BOOLisRequiredProperty, 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;

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_getAttributes);

}</pre></code>

属性类型字符串

可以使用property_getAttributes函数来获取名字,property的@encode类型字符串和其他property的属性。该字符串以T开头,随后是@encode
类型和逗号,最后是V和实例变量名称。在这之间,用以下描述符来指定属性,并用逗号分隔:

图片 1表7-1
声明属性类型编码

更多例子,可查看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返回的相应字符串:

图片 2表格

官方原文地址:

相关文章