使用runtime 前提导入头文件 #import <objc/runtime.h>
- 在不使用第三方字典转模型(YYModel)的框架的前提下 自己写字典转模型归档 有用到 runtime
// 解档
- (id)initWithCoder:(NSCoder *)aDecoder{
// 取得所有成员变量名
NSArray *properNames = [[self class] propertyOfSelf];
for (NSString *propertyName in properNames) {
// 创建指向属性的set方法
// 1.获取属性名的第一个字符,变为大写字母
NSString *firstCharater = [propertyName substringToIndex:1].uppercaseString;
// 2.替换掉属性名的第一个字符为大写字符,并拼接出set方法的方法名
NSString *setPropertyName = [NSString stringWithFormat:@"set%@%@:",firstCharater,[propertyName substringFromIndex:1]];
SEL setSel = NSSelectorFromString(setPropertyName);
[self performSelector:setSel withObject:[aDecoder decodeObjectForKey:propertyName]];
}
return self;
}
// 返回self的所有对象名称
+ (NSArray *)propertyOfSelf{
unsigned int count;
// 1. 获得类中的所有成员变量
Ivar *ivarList = class_copyIvarList(self, &count);
NSMutableArray *properNames =[NSMutableArray array];
for (int i = 0; i < count; i++) {
Ivar ivar = ivarList[i];
// 2.获得成员属性名
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 3.除去下划线,从第一个角标开始截取
NSString *key = [name substringFromIndex:1];
[properNames addObject:key];
}
return [properNames copy];
}
// 归档
- (void)encodeWithCoder:(NSCoder *)enCoder{
// 取得所有成员变量名
NSArray *properNames = [[self class] propertyOfSelf];
for (NSString *propertyName in properNames) {
// 创建指向get方法
SEL getSel = NSSelectorFromString(propertyName);
// 对每一个属性实现归档
[enCoder encodeObject:[self performSelector:getSel] forKey:propertyName];
// if (class_respondsToSelector([self classForCoder], getSel)) {
//
// id value = [self performSelector:getSel];
//
// // 如果value 有值 则进行保存
// if (value) {
//
// [enCoder encodeObject:value forKey:propertyName];
//
// NSLog(@"have value name %@", propertyName);
// }
// }
}
}
- 在不想实现莫个系统方法的的时候 进行方法替换
Method presentM = class_getInstanceMethod(self.class, @selector(presentViewController:animated:completion:));
Method presentSwizzlingM = class_getInstanceMethod(self.class, @selector(lq_presentViewController:animated:completion:));
method_exchangeImplementations(presentM, presentSwizzlingM);