//Key Value Coding(简称:KVC)中文含义:键值编码
//KVC利用字符串动态控制一个对象,操作方法由NSValueCoding协议提供,在NSObject中实现了该协议,所以在所有继承自NSObject中所有的对象都支持KVC操作
//常用属性有:
//1、动态设置
//setValue:<#(nullable id)#> forKey:<#(nonnull NSString *)#>用于简单路径(直接可以找到类的)
//setValue:<#(nullable id)#> forKeyPath:<#(nonnull NSString *)#>用于复合路径(类中包含类)
//2、动态读取
//valueForKey:<#(nonnull NSString *)#>
//valueForKeyPath:<#(nonnull NSString *)#>
//PS:参数说明:KEY值就是属性的名称
//KVC进行读取的查找规则:(查找过程中无论属性或方法是公有的还是私有的都是能正确读设)
//1、首先查找get/set方法(不存在进行下面的查找)
//2、”_”查找带下划线的实例变量(不存在进行下面的查找)
//3、直接查找不带下划线的实例变量(最后还是没有找到,进行下面的杀手锏)
//4、设置会调用:setValue:forUndefinedKey:
//or
//读取或调用:valueforUndefinedKey:
Demo:
Account类只是为了点明符合路径的使用
Account.h
#import <Foundation/Foundation.h>
@interface Account : NSObject
#pragma mark-属性
#pragma mark-余额
@property (nonatomic,assign)float balance;
@end
Account.m
#import "Account.h"
@implementation Account
@end
Person.h
#import <Foundation/Foundation.h>
@class Account;
@interface Person : NSObject{
@private int _age;
}
#pragma mark-属性
#pragma mark 姓名
@property (nonatomic,copy)NSString *name;
#pragma mark 账户
@property (nonatomic,strong)Account *account;
#pragma mark-公共方法
#pragma mark 显示人员信息
- (void)showMessage;
@end
#import "Person.h"
@implementation Person
#pragma mark - 公共方法
#pragma mark 显示人员信息
- (void)showMessage
{
NSLog(@"name = %@,age = %d",_name,_age);
}
@end
Person *person1 = [[Personalloc] init];
[person1 setValue:@"why"forKey:@"name"];
[person1 setValue:@22forKey:@"age"];
[person1 showMessage];
NSLog(@"person1姓名:%@,年龄:%@",person1.name,[person1valueForKey:@"age"]);
Account *account1 = [Accountnew];
person1.account = account1;
[person1 setValue:@100000000.0forKeyPath:@"account.balance"];
NSLog(@"person1存款余额:%.2f",[[person1valueForKeyPath:@"account.balance"]floatValue]);
//使用KVC数组计算,无需循环