什么是运行时呢??
OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法。利用runtime机制让我们可以在程序运行时动态修改类、对象中的所有属性、方法。
运行时是oc消息机制的平台,例如函数的调用,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
使用场景包括动态添加对象的成员变量、多态、方法交换等。开发中常用的运行时几个的方法:运行时机制。我们一般在开发中使用的比较多的就三个方法。第一个就是动态获取属性。第二个就是动态为分类添加属性。第三个就是俗称黑魔法的替换方法。也就是在编译的过程中就将系统或者分类的方法替换成我们想要的方法。
运行时归档解档还是蛮方便的啦~~
#pragma mark
#pragma mark - 归档存储
- (void)encodeWithCoder:(NSCoder *)aCoder{
//获取当前类
Class cls = [self class];
unsigned int ivarsCnt = 0;
//获取类成员的变量,ivasCnt 指的是成员的变量
Ivar * ivars = class_copyIvarList(cls, &ivarsCnt);
//变量成员变量列表,每个成员变量都是Ivar 类型的结构体
for (int i = 0; i <ivarsCnt; i++) {
//获取变量名
Ivar var = ivars[i];
const char * name = ivar_getName(var);
NSString * key = [NSString stringWithUTF8String:name];
//获取变量的值
id value = [self valueForKey:key];
//归档
[aCoder encodeObject:value forKey:key];
}
}
#pragma mark
#pragma mark - 解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
//获取当前类
Class cls = [self class];
unsigned int ivarsCnt = 0;
//获取成员变量,ivarsCnt就是成员变量
Ivar * ivars = class_copyIvarList(cls, &ivarsCnt);
//遍历成员变量,每个成员便令都是Ivar 类型的结构体
for (int i = 0 ; i < ivarsCnt; i++) {
//获取变量名
Ivar var = ivars[i];
const char * name = ivar_getName(var);
NSString * key = [NSString stringWithUTF8String:name];
//获取变量值,解档出来的值
id value = [aDecoder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
}
return self;
}
网友评论