成员变量、属性
- 基础数据类型
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 );