iOS基础 - KVC
▶ 什么是 KVC
1 - Key-Value-Coding 键值编码:一种间接访问实例变量的方法
2 - KVC 赋值机制
① 赋值查询成员变量的先后顺序是 _key、_isKey、key、isKey。比如实例变量 age,先后访问顺序就是 _age、_isAge、age、isAge
② 如果四个值都没有,就会调用 setValue:forUndefinedKey: 方法。注:如若需要,则必须重写该方法,否则程序 crash
3 - KVC 取值机制
① 取值查询成员变量的顺序同赋值机制 _key、_isKey、key、isKey
② 如果四个值均获取不到,就会调用 valueForUndefinedKey 方法!注:如若需要,则必须重写该方法,否则程序 crash
4 - KVC 特点
① 很黄很暴力,即使一个类的属性是私有的,同样可以读写,相当于 Java 中的反射,破坏了类的封装
② 它的模型性质是通过一个简单的键(通常是字符串)来指定。在开发中,视图或控制器就可通过对应键来获取其属性值
▶ 使用 KVC
1 - 一个人饲养了一条狗,那么就有 Person 和 Dog 两个类,并且 Dog 就成了 Person 的成员变量。我们在 main.m 文件中使用 KVC 为 Person 的 Dog 这一成员变量进行赋值
// - Dog.h
1 #import <Foundation/Foundation.h> 2 3 @interface Dog : NSObject 4 5 @end
// - Dog.m
1 #import "Dog.h" 2 3 @implementation Dog 4 5 @end
// - Person.h
1 #import <Foundation/Foundation.h> 2 @class Dog; 3 @interface Person : NSObject 4 { 5 @private // 验证:私有属性同样可以被 KVC 无视,实现直接赋值 6 NSString *_name; 7 NSInteger _age; 8 Dog *_dog; 9 } 10 11 @end
// - Person.m
1 #import "Person.h" 2 3 @implementation Person 4 5 - (NSString *)description{ 6 7 return [NSString stringWithFormat:@"%@,%@,%ld",_name,_dog,_age]; 8 } 9 10 // 重写赋值方法 11 -(void)setValue:(id)value forUndefinedKey:(NSString *)key{ 12 13 NSLog(@"value = %@",value); 14 NSLog(@"undefine Key = %@",key); 15 } 16 17 // 重写取值方法 18 - (id)valueForUndefinedKey:(NSString *)key{ 19 20 NSLog(@"undefine key = %@",key); 21 return nil; 22 } 23 @end
// - main.m
1 Person *person01 = [[Person alloc] init]; 2 // 第一个参数是值,第二个参数是键 (对应属性名) 3 [person01 setValue:@"Hazell" forKey:@"name"]; 4 // 基本类型赋值时,需要先将其转化成数字对象。不必担心属性赋值,它带有自动解包过程:数字对象会被系统自动解包成基本类型,然后赋值给成员变量 _age 5 [person01 setValue:@22 forKey:@"age"]; 6 NSLog(@"%@",person01); 7 // 将狗和人绑定 8 Dog *dog01 = [[Dog alloc] init]; 9 [person01 setValue:dog01 forKey:@"dog"]; 10 NSLog(@"%@",person01); 11 12 // 取值 13 NSString *str01 = [person01 valueForKey:@"name"]; 14 NSLog(@"%@",str01);
2 - 一个作者可有多本书、一本书对应一个作者的场景,代码如下
// - Author.h:作者
1 #import <Foundation/Foundation.h> 2 3 @interface Author : NSObject 4 { 5 NSString *_name; 6 NSArray *_issueBook;// 使用数组,模拟一个作者对应多本书籍 7 } 8 @end
// - Author.m
1 #import "Author.h" 2 3 @implementation Author 4 5 @end
// - Book.h:书
1 #import <Foundation/Foundation.h> 2 @class Author; 3 @interface Book : NSObject 4 { 5 Author *_author;// 作者 6 } 7 8 @property NSString *name; // 书名 9 @property CGFloat price; // 书价 10 11 @end
// - Book.m
1 #import "Book.h" 2 3 @implementation Book 4 5 @end
// - main.m
1 Author *author = [[Author alloc] init]; 2 [author setValue:@"莫言" forKeyPath:@"name"]; 3 4 Book *book1 = [[Book alloc] init]; 5 book1.name = @"红高粱"; 6 book1.price = 9; 7 Book *book2 = [[Book alloc] init]; 8 book2.name = @"平凡的世界"; 9 book2.price = 10; 10 11 NSArray *arrayBook = [NSArray arrayWithObjects:book1,book2,nil]; 12 [author setValue:arrayBook forKeyPath:@"issueBook"]; // KVC 赋值 13 // KVC 取值 14 NSArray *priceArray = [author valueForKeyPath:@"issueBook.price"]; 15 NSLog(@"%@",priceArray); 16 17 // KVC 运算 18 NSNumber *count = [author valueForKeyPath:@"issueBook.@count"];// 数组大小 19 NSLog(@"count=%@",count);// @count 是特定一个写法,可以把它想象成一个方法 20 21 NSNumber *sum = [author valueForKeyPath:@"issueBook.@sum.price"];// 书价总额 22 NSLog(@"%@",sum);// price 是属性,可以把它看成是 @sum 的一个参数,中间用点号进行连接 23 24 NSNumber *avg = [author valueForKeyPath:@"issueBook.@avg.price"];// 平均值 25 NSLog(@"%@",avg); 26 27 NSNumber *max = [author valueForKeyPath:@"issueBook.@max.price"];// 最大值和最小值 28 NSLog(@"%@",max); 29 NSNumber *min = [author valueForKeyPath:@"issueBook.@min.price"]; 30 NSLog(@"%@",min);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律