KVC底层原理

2019-07-15  本文已影响0人  寂寞先森666

第一步、寻找相应setName 方法

第二步、如果没找到setName 方法,那么调用

+ (BOOL)accessInstanceVariablesDirectly //如果setName没有找到该方法,那么询问是否直接访问实例变量 directly 直接的
{
    return YES;
}

如果上面返回YES 按顺序寻找 "符合条件" 的实例变量

@implementation person
{
    //顺序往下
    NSString * _name;
    NSString * _isName;
    NSString * name;
    NSString * isName;

}

第三步、如果重写下面方法

#import "person.h"

@implementation person
-(id)valueForUndefinedKey:(NSString *)key
{
    NSLog(@"key:%@",key);
    return @"xxxxx";
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"key:%@",key);
}
@end

否则crash
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<person 0x600003560550> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'

kvc使用案例

修改前

刚开始是长这个样子的,但是在pageControl 这个类中并不能找到相应的修改属性,这个时候用runtime去拿到这个私有属性,再通过KVC去修改

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    UIPageControl  * pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(100, 100, 300, 60)];
    pageControl.numberOfPages = 5;
    pageControl.currentPage = 2;
    pageControl.tintColor = [UIColor darkGrayColor];
    
    [pageControl setValue:[UIImage imageNamed:@"changfangxing-2.png"] forKey:@"_pageImage"];
    [pageControl setValue:[UIImage imageNamed:@"changfangxing-3.png"] forKey:@"_currentPageImage"];

    
    [self.view addSubview:pageControl];
}
修改后

参考资料:https://www.jianshu.com/p/ee74bd7169be

上一篇 下一篇

猜你喜欢

热点阅读