Runtime&KVC知识回顾

KVC底层原理

遍历字典,一一赋值

-(instancetype)initWithDict:(NSDictionary * )dict{
    MyModel *item = [[MyModel alloc]init];
        
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull value, BOOL *
           [item setValue:value forKey:key];
    }];
    return item;
   }

例如:name

  • 1.先找setName方法
  • 2.找不到setName方法就找name属性
  • 3.找不到name属性就找_name属性
  • 4.如果都找不到,就报错

Runtime

方法使用场景和注意要点

  • 交换方法

+(void)load{
    Method imageNameMethod = class_getClassMethod(self, @selector(imageNamed:));
    Method my_imageNameMethod = class_getClassMethod(self, @selector(my_ImageNamed:));
    method_exchangeImplementations(imageNameMethod, my_imageNameMethod);
}

+(UIImage *)my_ImageNamed:(NSString *)Name{
    UIImage * image = [UIImage my_ImageNamed:Name];
    if (image) {
        NSLog(@"加载成功");
    }else{
        NSLog(@"加载失败");
    }
    return image;
}

应用场景:希望扩充系统分类方法的时候。不改变原有系统方法的同时,实现自定义扩展方法。

要点:将交换实现写在 load 方法中,在加载程序的时候就会调用

  • 动态添加属性

.h文件
@property NSString * name;//只是申明set,和get方法,并不实现

.m文件

-(void)setName:(NSString *)name{
    /*
    *objc_setAssociatedObject(id  _Nonnull object, const void * _Nonnull key, id  _Nullable value, objc_AssociationPolicy policy)
    *object:哪个类
    *key:属性名
    *name:参数
    *policy:策略
    */
    objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSString *)name{
    return objc_getAssociatedObject(self, "name");
}


应用场景:分类添加属性

  • 动态添加方法(消息转发)

void doit(id self,SEL _cmd){//self和_cmd隐式参数,必须要
    NSLog(@"进来了");
}

+(BOOL)resolveInstanceMethod:(SEL)sel{
    if (sel == NSSelectorFromString(@"eat")) {
        class_addMethod(self, sel, (IMP)doit, "v@:");
        
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

应用场景:没必要一次性实现,付费用户功能等

要点:调用一个不存在的方法,如果找不到,会转发消息到resolveInstanceMethod方法,在resolveInstanceMethod中处理。

(持续编辑中)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,958评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,612评论 8 265
  • 冷与热 泪与笑 在生活里交替 地狱炼火 在身上 实验 唯有头脑 清醒 冲刷内心的尘与土
    尘世一眼阅读 154评论 0 0
  • 天空 被风吹走了所有悲欢离合 剩下清澈的空灵 仿若随手打翻了蓝色的墨水瓶 晕染开的 千丝万缕的蓝 万物寂寥 如失去...
    从A到Z阅读 164评论 0 3