[OC Runtime编程指南_翻译]八、声明属性

简介: [OC Runtime编程指南_翻译]八、声明属性

当编译器遇到属性声明(请参阅 _Objective-C _编程语言声明属性)时,它会生成与封闭类、类别或协议相关联的描述性元数据。您可以使用支持在类或协议上按名称查找属性、以@encode字符串形式获取属性类型以及以C字符串数组形式复制属性属性列表的函数来访问此元数据。声明的属性列表可用于每个类和协议


属性类型和功能


Property结构定义属性描述符的不透明句柄。

typedef struct objc_property *Property;

可以使用函数class_copyPropertyListprotocol_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_getPropertyprotocol_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 StringProperty 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  声明的属性类型编码

image.png

示例, 请参见 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返回的相应字符串:

image.pngimage.png

image.png

相关文章
|
Swift iOS开发
Swift - 与OC混编时如何创建桥接头文件
Swift - 与OC混编时如何创建桥接头文件
396 0
Swift - 与OC混编时如何创建桥接头文件
|
前端开发 Swift 数据安全/隐私保护
Swift实用小册01:参数声明、数据类型、命名方式、代码注释
Swift实用小册01:参数声明、数据类型、命名方式、代码注释
200 1
|
前端开发 Swift
Swift实用小册10:实例方法和类型方法的使用
Swift实用小册10:实例方法和类型方法的使用
191 0
Swift实用小册10:实例方法和类型方法的使用
|
编译器 iOS开发
[OC Runtime编程指南_翻译]七、类型编码
[OC Runtime编程指南_翻译]七、类型编码
90 0
[OC Runtime编程指南_翻译]七、类型编码
|
算法 iOS开发
[OC Runtime编程指南_翻译]六、消息转发
[OC Runtime编程指南_翻译]六、消息转发
126 0
[OC Runtime编程指南_翻译]六、消息转发
|
存储 安全 编译器
Swift-进阶 02:类、对象、属性
Swift-进阶 02:类、对象、属性
294 0
Swift-进阶 02:类、对象、属性
|
缓存 编译器 iOS开发
[OC Runtime编程指南_翻译]四、消息传递
本章介绍如何将消息表达式转换为objc_msgSend函数调用,以及如何按名称引用方法。然后解释如何利用objc_msgSend,以及如果需要,如何绕过动态绑定。
102 0
[OC Runtime编程指南_翻译]四、消息传递
|
编译器 iOS开发
[OC Runtime编程指南_翻译]五、动态方法解析
[OC Runtime编程指南_翻译]五、动态方法解析
87 0
|
NoSQL 编译器 iOS开发
[OC Runtime编程指南_翻译]三、与运行时交互
[OC Runtime编程指南_翻译]三、与运行时交互
121 0
|
iOS开发
[OC Runtime编程指南_翻译]二、运行时版本和平台
[OC Runtime编程指南_翻译]二、运行时版本和平台
124 0