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对这个方法的调用。

    ---
  • 相关阅读:
    【POJ2893&HDOJ6620】M &#215; N Puzzle(n*m数码判定)
    idea破解方法
    ORACLE:MERGE INTO
    DOS命令大全
    使用oracle 的 PL/Sql 定时执行一个存储过程
    spring RestTemplate用法详解
    Oracle截取字符串和查找字符串
    PLSQL Developer常用设置及快捷键
    IntelliJ IDEA设置自动导入包
    Git使用详细教程
  • 原文地址:https://www.cnblogs.com/cwgk/p/3940530.html
Copyright © 2011-2022 走看看