目录
前言
1.iOS中的KVC(键值编码)
1. 什么是KVC?
2. 使用KVC
1.设置属性值
2.获取属性值
3. KVC的高级用法
1.访问私有属性
2.访问集合属性
4. KVC的安全性
5. KVC原理
1. 查找顺序
2. 设置值
6.参考文章
前言
这篇文章主要是介绍KVC的用法。
1.iOS中的KVC(键值编码)
在iOS开发中,KVC(Key-Value Coding,键值编码)是一种强大的机制,使得我们能够通过字符串键来访问对象的属性。KVC在许多iOS框架和技术中扮演着关键角色,包括Core Data、Cocoa Bindings以及KVO(Key-Value Observing,键值观察)。
1. 什么是KVC?
KVC是一种间接访问对象属性的方法。通常,我们通过属性的getter和setter方法来访问或修改对象的属性。但使用KVC,我们可以通过字符串键来访问这些属性,这使得代码更加灵活和动态。
2. 使用KVC
KVC主要通过setValue:forKey和valueForKey:方法来实现。
1.设置属性值
#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;@end@implementation Person
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];// 使用KVC设置属性值[person setValue:@"John" forKey:@"name"];[person setValue:@30 forKey:@"age"];NSLog(@"Name: %@", person.name);NSLog(@"Age: %ld", (long)person.age);}return 0;
}
2.获取属性值
int main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];[person setValue:@"John" forKey:@"name"];[person setValue:@30 forKey:@"age"];// 使用KVC获取属性值NSString *name = [person valueForKey:@"name"];NSNumber *age = [person valueForKey:@"age"];NSLog(@"Name: %@", name);NSLog(@"Age: %@", age);}return 0;
}
3. KVC的高级用法
1.访问私有属性
KVC不仅可以访问公共属性,还可以访问私有属性。尽管这是KVC的一个强大功能,但在实际开发中要谨慎使用。
@interface Person ()@property (nonatomic, strong) NSString *secret;@end@implementation Person
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];// 使用KVC访问私有属性[person setValue:@"This is a secret" forKey:@"secret"];NSString *secret = [person valueForKey:@"secret"];NSLog(@"Secret: %@", secret);}return 0;
}
2.访问集合属性
KVC还提供了一些便捷方法来访问集合类型的属性,如数组和字典。
@interface Group : NSObject@property (nonatomic, strong) NSArray<Person *> *members;@end@implementation Group
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person1 = [[Person alloc] init];[person1 setValue:@"Alice" forKey:@"name"];[person1 setValue:@25 forKey:@"age"];Person *person2 = [[Person alloc] init];[person2 setValue:@"Bob" forKey:@"name"];[person2 setValue:@28 forKey:@"age"];Group *group = [[Group alloc] init];group.members = @[person1, person2];// 使用KVC访问集合属性NSArray *names = [group valueForKeyPath:@"members.name"];NSLog(@"Names: %@", names);}return 0;
}
4. KVC的安全性
使用KVC时需要注意一些安全性问题,例如:
- 如果指定的键不存在,KVC会抛出一个异常。
- 访问或修改私有属性可能违反封装性原则。
因此,使用KVC时要确保键的正确性,并且要对可能出现的异常进行适当的处理。
5. KVC原理
KVC 的实现主要依赖于以下几个方面:
1. 查找顺序
当通过 `valueForKey:` 获取值时,KVC 按以下顺序查找属性:
- Getter 方法:首先查找与键对应的 getter 方法。例如,对于键 `name`,查找 `getName`、`name` 或 `isName` 方法。
- 实例变量:如果没有找到合适的 getter 方法,则查找以键命名的实例变量 `_name` 或 `name`
- -accessInstanceVariablesDirectly:如果前两个查找都失败,KVC 会调用 `accessInstanceVariablesDirectly` 方法,该方法返回 YES 表示可以直接访问实例变量。
2. 设置值
当通过setValue:forKey:设置值时,KVC 按以下顺序查找属性:
- Setter 方法:首先查找与键对应的 setter 方法。例如,对于键 name,查找 setName: 方法。
- 实例变:如果没有找到合适的 setter 方法,则查找以键命名的实例变量_name或 name
- setValue:forUndefinedKey:如果前两个查找都失败,KVC 会调用 `setValue:forUndefinedKey:` 方法,该方法通常会抛出一个异常。
#### KVC 的查找规则示例
@interface Person : NSObject {NSString *_name;
}
@property (nonatomic, strong) NSString *name;
@end@implementation Person
@end
当调用 `[person valueForKey:@"name"]` 时,KVC 的查找顺序如下:
1. 查找 `- (NSString *)name` 方法。
2. 查找 `- (NSString *)getName` 方法。
3. 查找 `- (NSString *)isName` 方法。
4. 查找实例变量 `_name` 和 `name`。
5. 调用 `accessInstanceVariablesDirectly` 方法,返回 YES,直接访问 `_name`。
当调用 [person setValue:@"John" forKey:@"name"] 时,KVC 的查找顺序如下:
1. 查找 - (void)setName:(NSString *)name 方法。
2. 查找实例变量 `_name` 和 `name`。
3. 调用 `setValue:forUndefinedKey:` 方法。
6.参考文章
1.Key-Value Coding Programming Guide: About Key-Value Coding