iOS - KVC

KVC-键值编码
KVC:对象取值或者设置值。
KVO:监听对象值的变化。

获取对象值的优先级

OC对象的属性是由3部分组成的,包括成员变量,setter方法,getter方法。
KVC原理图


image.png

KVC取值优先级

1,查找对象的相关方法(getName,name,isName)。
2,看对象+(BOOL)accessInstanceVariablesDirectly的返回值,YES就查找成员变量,NO就报异常。
3,成员变量优先级。
例如获取name的值

PersonModel *model = [[PersonModel alloc]init];
    NSLog(@"%@",[model valueForKey:@"name"]) ;

对象方法高于成员变量,三个获取值的get方法,优先级如下

-(NSString *)getName{
    return @"1111";
}

-(NSString *)name{
    return @"2222";
}
-(NSString *)isName{
    return @"3333";
}

成员变量查找优先级依次如下,只要存在声明就会优先,不管有没有值

@interface PersonModel : NSObject{
    NSString *_name;
    NSString *_isName;//注意大写
    NSString *name;
    NSString *isName;//注意大写
}

KVC设值

KVC设置值优先级和取值类似

1,查找对象的相关方法(setKey,setIsName)。
2,看对象+(BOOL)accessInstanceVariablesDirectly的返回值,YES就查找成员变量,NO就报异常。
3,成员变量优先级,外界可以通过KVC修改成员变量。
例子,通过KVC设置person的name

 PersonModel *person = [[PersonModel alloc]init];
    [person setValue:@"kvo" forKey:@"name"];

相关方法

-(void)setName:(NSString *)name{
    NSLog(@"setName%@",name);
}
-(void)setIsName:(NSString *)name{
    NSLog(@"setIsName%@",name);
}

知识点

1,嵌套的拿数据方法valueForKeyPath,例如person里的dog的age属性,依次查找dog和age,查找方法和valueForKey是一样的。

id age = [person valueForKeyPath:@"dog.age"];

2,找不到成员变量报异常避免崩溃的方法

-(id)valueForUndefinedKey:(NSString *)key{
    return nil;
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"没有找到%@",key);
} 
-(void)setNilValueForKey:(NSString *)key{
    NSLog(@"不能将%@设置为nil",key);
}

利用runtime获取对象的全部成员变量

/// 获取对象全部的成员变量
-(void)getAllProperty{
    unsigned int count = 0;
    //将对象的成员属性列表拷贝出来,count引用传递,可以拿到对象成员变量的个数
    Ivar *ivars = class_copyIvarList([self class], &count);
    //
    NSMutableArray *arr = [NSMutableArray array];
    
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *propertyName = [NSString stringWithUTF8String:name];
        [arr addObject:propertyName];
    } 
    
    NSLog(@"\n-----%@的成员变量-----\n%@\n------------------------------",NSStringFromClass([self class]),arr);
    free(ivars);
    
}

KVC的运算符

PersonModel *p1 = [[PersonModel alloc]init];
    p1.age = 13;
    PersonModel *p2 = [[PersonModel alloc]init];
    p2.age = 11;
    PersonModel *p3 = [[PersonModel alloc]init];
    p3.age = 15;
    
    NSMutableArray *arr = [NSMutableArray array];
    [arr addObjectsFromArray:@[p1,p2,p3]];
    //KVC的运算符,主要针对数组,包括@max,@min,@sum,@avg,@count
    NSLog(@"属性中的最大值是%@",[arr valueForKeyPath:@"@max.age"]);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC是一种通过字符串的名字(key)来访问修改类属性值的机制。而不是通过Setter、Getter方法直接访问。...
    zhongli_007阅读 8,504评论 0 3
  • 1. Basic methods KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允...
    木小易Ying阅读 1,319评论 0 4
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 6,497评论 2 9
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    jackyshan阅读 52,077评论 9 200
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,585评论 0 11