您的位置:首页 > 移动开发 > Objective-C

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

2016-06-24 11:13 585 查看

成员变量、属性

基础数据类型

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 );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c runtime