iOS KVC (三)不可不知的取值深层次原理

2018-05-16  本文已影响254人  奔跑吧小蚂蚁

iOS KVC(一)基本了解
iOS KVC (二) 不可不知的赋值深层次原理
iOS KVC (三)不可不知的取值深层次原理
iOS KVC (四)keyPath的深度解析
iOS KVC (五)KVC几种典型的异常处理
iOS KVC (六) KVC容器类及深层次原理
iOS KVC(七) KVC正确性的验证
iOS KVC (八) KVC几种常见应用
iOS KVC (九) KVC模型转化(1) 模型打印 description, debugDescription
iOS KVC (十)模型转换(2)模型转换

KVC取值

当调用valueForKey:@”name“的代码时,KVC对key的搜索方式不同于setValue:属性值 forKey:@”name“,其搜索方式如下:

还没有找到的话,调用valueForUndefinedKey:

下面结合例子进行说明:

#import "ViewController.h"
@interface ViewController ()

@property (nonatomic, assign) NSUInteger count;
@property (nonatomic, copy) NSString *arrName;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSNumber* num =   [self valueForKey:@"num"];
    NSLog(@"num:%@",num);
    
    id arr = [self valueForKey:@"numbers"];
    NSLog(@"arr:%@",NSStringFromClass([arr class]));
    NSLog(@"0:%@, 1:%@, 2:%@, 3:%@",arr[0],arr[1],arr[2],arr[3]);
    
    [self incrementCount];
    //count加1
    NSLog(@"[arr count]:%lu",(unsigned long)[arr count]);
//
    [self incrementCount];
    //count再加1
    NSLog(@"[arr count]:%lu",(unsigned long)[arr count]);
    
    [self setValue:@"newName" forKey:@"arrName"];
    NSString *name = [self valueForKey:@"arrName"];
    NSLog(@"name:%@",name);
}

#pragma mark - Objetc Private Function
- (void)incrementCount
{
    self.count ++;
}

- (NSUInteger)countOfNumbers
{
    NSLog(@"countOfNumbers");
    return self.count;
}

//当key使用numbers时,KVC会找到这两个方法。

- (id)objectInNumbersAtIndex:(NSUInteger)index
{
    NSLog(@"+++++objectInNumbersAtIndex");
    return @(index * 2);
}

- (NSInteger)getNum
{
    NSLog(@"getNum---->1");
    return 10;
}

- (NSInteger)num
{
    NSLog(@"num---->2");
    return 11;
}

- (NSInteger)isNum
{
    NSLog(@"isNum---->3");
    return 12;
}

打印数据:
2018-05-17 09:50:46.200687+0700 KVC[26295:638696] getNum---->1
2018-05-17 09:50:46.200798+0700 KVC[26295:638696] num:10
2018-05-17 09:50:46.200947+0700 KVC[26295:638696] arr:NSKeyValueArray
2018-05-17 09:50:46.201045+0700 KVC[26295:638696] +++++objectInNumbersAtIndex
2018-05-17 09:50:46.201135+0700 KVC[26295:638696] +++++objectInNumbersAtIndex
2018-05-17 09:50:46.201248+0700 KVC[26295:638696] +++++objectInNumbersAtIndex
2018-05-17 09:50:46.201343+0700 KVC[26295:638696] +++++objectInNumbersAtIndex
2018-05-17 09:50:46.201416+0700 KVC[26295:638696] 0:0, 1:2, 2:4, 3:6
2018-05-17 09:50:46.201506+0700 KVC[26295:638696] countOfNumbers
2018-05-17 09:50:46.201594+0700 KVC[26295:638696] [arr count]:1
2018-05-17 09:50:46.201659+0700 KVC[26295:638696] countOfNumbers
2018-05-17 09:50:46.201723+0700 KVC[26295:638696] [arr count]:2
2018-05-17 09:50:46.201825+0700 KVC[26295:638696] name:newName

这块要看自己的悟性了,因为很难说清处里面的一些东西。也可参考官方给出的说法。

上一篇 下一篇

猜你喜欢

热点阅读