Objective-C 运行时(成员变量和属性)

来源:互联网 发布:landmark软件安装 编辑:程序博客网 时间:2024/05/16 04:26

成员变量、属性

  • 基础数据类型
    Ivar是表示实例变量的类型,其实际是一个指向objc_ivar结构体的指针,其定义如下:
typedef struct objc_ivar *Ivar;struct objc_ivar {    char *ivar_name                 OBJC2_UNAVAILABLE;  // 变量名    char *ivar_type                 OBJC2_UNAVAILABLE;  // 变量类型    int ivar_offset                 OBJC2_UNAVAILABLE;  // 基地址偏移字节#ifdef __LP64__    int space                       OBJC2_UNAVAILABLE;#endif} 

objc_property_t是表示Objective-C声明的属性的类型,其实际是指向objc_property结构体的指针,其定义如下:

typedef struct objc_property *objc_property_t;

objc_property_attribute_t定义了属性的特性(attribute),它是一个结构体,定义如下:

typedef struct {    const char *name;           // 特性名    const char *value;          // 特性值} objc_property_attribute_t;

关联对象

关联对象(Associated Object)可以解决分类无法添加新的成员变量,可以把关联对象想象成一个Objective-C对象,这个对象通过给定的key连接到类的一个实例上。不过是C接口,所以key是一个void指针,需要指定内存策略,告诉Runtime如何管理这个对象的内存。

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {    OBJC_ASSOCIATION_ASSIGN = 0,    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,    OBJC_ASSOCIATION_RETAIN = 01401,    OBJC_ASSOCIATION_COPY = 01403};
//设置关联对象void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);//获取关联对象id objc_getAssociatedObject(id object, const void *key);//移除关联对象void objc_removeAssociatedObjects(id object)

成员变量、属性的操作方法

获取成员变量名

const char * ivar_getName( Ivar v );

获取成员变量类型编码

const char * ivar_getTypeEncoding( Ivar v );

获取成员变量的偏移量

ptrdiff_t ivar_getOffset( Ivar v );

获取属性名

const char * property_getName( objc_property_t property );

获取属性特性描述字符串

const char * property_getAttributes( objc_property_t property);

获取属性中指定的特性,返回的char *在使用完后需要调用free()释放。

char * property_copyAttributeValue( objc_property_t property, const char *attributeName );

获取属性的特性列表,返回的char *在使用完后需要调用free()释放。

objc_property_attribute_t * property_copyAttributeList( objc_property_t property, unsigned int *outCount );
0 0
原创粉丝点击