美文网首页
runtime 在实际工作中的运用

runtime 在实际工作中的运用

作者: iOS_zeng | 来源:发表于2019-05-29 11:05 被阅读0次

    使用runtime 前提导入头文件 #import <objc/runtime.h>

    1. 在不使用第三方字典转模型(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);
    //            }
    //        }
        }
    }
    
    
    1. 在不想实现莫个系统方法的的时候 进行方法替换
      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);
    
    
    

    相关文章

      网友评论

          本文标题:runtime 在实际工作中的运用

          本文链接:https://www.haomeiwen.com/subject/teletctx.html