翻译:Objective-C运行时编程指南(七)——声明属性(Declared Properties)

当编译器遇到属性声明时(参见The Objective-C 编程语言中的声明属性),它生成与封闭类、分类或协议相关的描述性元数据。可以通过函数访问元数据,该函数支持通过类或协议名称查找属性,获取属性的类型作为@encode 字符串,并复制property的属性列表作为C字符串数组。声明的属性列表可用于每个类和协议。

属性类型和函数

属性结构为属性描述符定义了一个不透明句柄。


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 Encodings);字符串详情可查看属性类型字符串和property属性描述例子。

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

翻译:Objective-C运行时编程指南(七)——声明属性(Declared Properties)_第1张图片
表7-1 声明属性类型编码

更多例子,可查看property属性描述示例。
property属性描述示例给出以下定义:


enum FooManChu { FOO, MAN, CHU };

struct YorkshireTeaStruct { int pot; char lady; };

typedef struct YorkshireTeaStruct YorkshireTeaStructType;

union MoneyUnion { float alone; double down; };


下面的表格显示了属性声明和property_getAttributes返回的相应字符串:

翻译:Objective-C运行时编程指南(七)——声明属性(Declared Properties)_第2张图片
表格

官方原文地址:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html#//apple_ref/doc/uid/TP40008048-CH101-SW1

你可能感兴趣的:(翻译:Objective-C运行时编程指南(七)——声明属性(Declared Properties))