zoukankan      html  css  js  c++  java
  • iOS.KVC.setValue:forKey:

    Foundation Framework 定义了 NSObject(NSKeyValueCoding),

    - (void)setValue:(id)value forKey:(NSString *)key;
    

     该接口的说明

    1. 先在message receiver的class中搜索方法 -set<Key>:

    2. 如果1中未找到,则在class中以此搜索 _<key>, _is<key>, <key>, is<Key> 实例变量

    3. 如果2中未找到,则调用方法 -setValue:forUndefinedKey:, 而该方法默认的实现是抛出

    异常 NSUndefinedKeyException

    接下来问题来,那么在iOS SDK中那么多framework,那么多的class,那么哪些class覆盖了NSObject

    对-setValue:forUndefinedKey:的默认实现呢?

    1 IMP animationImp = [CAAnimation instanceMethodForSelector:@selector(setValue:forUndefinedKey:)];
    2 
    3 IMP defaultImp = [NSObject instanceMethodForSelector:@selector(setValue:forUndefinedKey:)];
    4 
    5 IMP viewImp = [UIView instanceMethodForSelector:@selector(setValue:forUndefinedKey:)];
    6 
    7 NSLog(@"defaultImp: %p, animationImp: %p, viewImp: %p", defaultImp, animationImp, viewImp);

    log的输出为:defaultImp: 0x125dc84, animationImp: 0x10d5ca, viewImp: 0x125dc84

    可见UIView并没有覆盖NSObject的默认实现,即一个class和NSObject 类 对以下调用的返回值一致

    instanceMethodForSelector:@selector(setValue:forUndefinedKey:) 

    所以在使用 -setValue:forKey:时需要用try-catch 来wrap对这个方法的调用。

    ---
  • 相关阅读:
    MySQL常用函数
    SQL之join
    java并发编程之三--CyclicBarrier的使用
    java并发编程之二--CountDownLatch的使用
    java并发编程之一--Semaphore的使用
    微信小程序 bindcontroltap 绑定 没生效
    报错:Syntax error on tokens, delete these tokens
    java创建类的5种方式
    数据类型转换
    JS数据结构算法---数组的算法
  • 原文地址:https://www.cnblogs.com/cwgk/p/3940530.html
Copyright © 2011-2022 走看看