1.Ivar
1.1Ivar 的类型
typedef objc_ivar * Ivar;
struct objc_ivar {
char *ivar_name;
char *ivar_type;
int ivar_offset;
#ifdef __LP64__
int space;
#endif
}
Ivar是objc_ivar的指针,包含变量名,变量类型等成员。
1.2为类添加 Ivar
运行时规定,只能在objc_allocateClassPair与objc_registerClassPair两个函数之间为类添加变量
如下所示:
Class clazz = objc_allocateClassPair(父类class,类名,额外空间);
BOOL flag = class_addIvar(clazz,变量名,变量size,对齐,类型);
objc_registerClassPair(clazz);
1.3 Ivar的相关操作
const char *ivar_getName(Ivar v);
const char *ivar_getTypeEncoding(Ivar v)
Ivar class_getInstanceVariable(Class cls, const char *name)
Ivar class_getClassVariable(Class cls, const char *name)
Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
id object_getIvar(id obj, Ivar ivar)
void object_setIvar(id obj, Ivar ivar, id value)
1.4 Ivar的使用
Class People = objc_allocateClassPair([NSObject class], "People", 0);
BOOL flag1 = class_addIvar(People, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
if (flag1) {
NSLog(@"NSString*类型 _name变量添加成功");
}
BOOL flag2 = class_addIvar(People, "_age", sizeof(int), sizeof(int), @encode(int));
if (flag2) {
NSLog(@"int类型 _age变量添加成功");
}
objc_registerClassPair(People);
unsigned int varCount;
Ivar * varList = class_copyIvarList(People, &varCount);
for (int i = 0; i
2 Property
2.1 objc_property_t 与 objc_property_attribute_t类型
typedef struct objc_property *objc_property_t;
typedef struct {
const char *name;
const char *value;
} objc_property_attribute_t;
特性相关编码
属性的特性字符串 以 T@encode(type) 开头, 以 V实例变量名称 结尾,中间以特性编码填充,通过property_getAttributes即可查看
特性编码 具体含义
R readonly
C copy
& retain
N nonatomic
G(name) getter=(name)
S(name) setter=(name)
D @dynamic
W weak
P 用于垃圾回收机制
2.2 为类添加Property
BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
2.3 Property的相关操作
void class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
objc_property_t class_getProperty(Class cls, const char *name)
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
const char *property_getName(objc_property_t property)
const char *property_getAttributes(objc_property_t property)
objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount)
char *property_copyAttributeValue(objc_property_t property, const char *attributeName)
2.4 Property的使用
Class People = objc_allocateClassPair([NSObject class], "People", 0);
objc_registerClassPair(People);
objc_property_attribute_t attribute1;
attribute1.name = "T";
attribute1.value=@encode(NSString*);
objc_property_attribute_t attribute2 = {"N",""};
objc_property_attribute_t attribute3 = {"C",""};
objc_property_attribute_t attribute4 = {"V","_name"};
objc_property_attribute_t attributes[] ={attribute1,attribute2,attribute3,attribute4};
class_addProperty(People, "name", attributes, 4);
unsigned int propertyCount;
objc_property_t * properties = class_copyPropertyList(People, &propertyCount);
for (int i = 0; i
本文转自简书中 ‘Ivar 详解’ 作者:秀才不才 地址:www.jianshu.com/p/ead476cdb…