美文网首页
KVC 的取值赋值

KVC 的取值赋值

作者: 游城十代2dai | 来源:发表于2020-04-07 14:55 被阅读0次

赋值

  1. KVC 会按照一定顺序进行赋值: setKey:, _setKey: , _key, _isKey, key, iskey
  2. 方法 accessInstanceVariablesDirectly 控制是否能访问成员变量
  3. 底层实现会在实际赋值前后添加 willChangeValueForKey:didChangeValueForKey: 方法, 所以 KVC 一定会触发 KVO

取值

KVC 会按照一定顺序进行取值: getKey, key, isKey, _key

//  KVC 全称 "Key Value Coding"
#import <Foundation/Foundation.h>

void _aboutKVC(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        _aboutKVC();
    }
    return 0;
}

@interface Person : NSObject {
    int _gender;
}
@property (nonatomic, assign) int age;
@end

@implementation Person
@synthesize age = _age;

// KVC 会优先访问这个 setter
- (void)setAge:(int)age {
    _age = age;
}

// KVC 如果找不到普通的 setter, 就会找带有下划线的
- (void)_setHeight:(double)height {
    NSLog(@"heightv--> %lf", height);
}

// 该方法用于控制是否可以用 KVC 访问成员变量, 优先查找带有下划线的成员变量_key, _isKey, key, iskey
+ (BOOL)accessInstanceVariablesDirectly {
    return YES;
}

// 取值原理 按照以下顺序
- (int)getAge {
    return _age;
}
- (int)age {
    return _age;
}
- (int)isAge {
    return _age;
}
- (int)_age {
    return _age;
}

@end

void _aboutKVC() {
    Person *person = Person.new;
    
    // 普通的赋值和读取
    person.age = 10;
    NSLog(@"%d", person.age);
    
    // KVC
    // KVC 会调用 set 方法, 具体看 Person 类实现
    [person setValue:@20 forKey:@"age"];
    NSLog(@"%d", [[person valueForKey:@"age"] intValue]);
    
    [person setValue:@172.1 forKey:@"height"];
    
    [person setValue:@2 forKey:@"_gender"];
    NSLog(@"%d", [[person valueForKey:@"_gender"] intValue]);
}


相关文章

网友评论

      本文标题:KVC 的取值赋值

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