面试题答案
一键面试KVC工作原理
- 基本概念:KVC是一种通过键(key)来访问对象属性(value)的机制,它提供了一种间接访问对象属性的方式,而不依赖于传统的存取方法(getter和setter)。
- 查找路径:
- 当通过KVC访问对象属性时,首先会按照对象方法调用的方式查找对应的存取方法(
get<Key>
、<key>
、is<Key>
作为getter,set<Key>:
作为setter)。如果找到,就使用这些方法进行属性访问。 - 如果没有找到存取方法,KVC机制会尝试直接访问对象的实例变量(
_<key>
、_is<Key>
、<key>
)。 - 如果上述步骤都失败,会调用
accessInstanceVariablesDirectly
方法。如果该方法返回NO
,则会触发setValue:forUndefinedKey:
(写操作)或valueForUndefinedKey:
(读操作)方法,默认实现会抛出异常。
- 当通过KVC访问对象属性时,首先会按照对象方法调用的方式查找对应的存取方法(
- 集合操作:对于集合对象(如
NSArray
、NSSet
),KVC提供了特殊的集合操作语法。例如,可以通过@avg
、@sum
等集合运算符对集合中的元素进行计算。
常见应用场景
1. 数据模型绑定
在MVC架构中,视图层需要展示数据模型中的数据。例如,有一个简单的Person
类:
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
在视图控制器中,可以通过KVC将Person
对象的属性绑定到视图控件(假设使用UILabel
显示名字和年龄):
Person *person = [[Person alloc] init];
person.name = @"John";
person.age = 30;
UILabel *nameLabel = [[UILabel alloc] init];
UILabel *ageLabel = [[UILabel alloc] init];
[nameLabel setValue:person forKeyPath:@"name"];
[ageLabel setValue:person forKeyPath:@"age"];
这样,当Person
对象的属性值改变时,视图控件可以相应更新(如果结合KVO机制,可实现更完整的绑定效果)。
2. 集合计算
假设有一个NSArray
存储了多个Person
对象,需要计算所有人的平均年龄:
NSArray *people = @[
[[Person alloc] initWithName:@"Alice" age:25],
[[Person alloc] initWithName:@"Bob" age:30],
[[Person alloc] initWithName:@"Charlie" age:35]
];
NSNumber *averageAge = [people valueForKeyPath:@"@avg.age"];
NSLog(@"Average age: %@", averageAge);
这里通过KVC的集合运算符@avg
计算出了数组中所有Person
对象age
属性的平均值。