博客
关于我
iOS KVC/KVO
阅读量:796 次
发布时间:2023-03-25

本文共 1889 字,大约阅读时间需要 6 分钟。

Objective-C 中的 KVC 和 KVO 实用指南

1. KVC(键值编码)简介

KVC 提供了一种通过字符串键值来间接修改对象属性的方式,适用于在不知道对象类型的情况下对属性进行操作。这种方法通过调用 valueForKey:setValue:ForKey: 方法实现。

1.1 KVC 的基本使用方法

  • 单次赋值
Student *stu = [[Student alloc] init];
[stu setValue:@"John" forKey:@"name"];
// 通过 key 取出当前值
NSString *name = [stu valueForKey:@"name"];
  • 批次赋值
[stu setValuesForKeysWithDictionary:@{
@"age": @20,
@"name": @"Jim"
}];
// 批量赋值后获取所有值
NSDictionary *values = [stu dictionaryWithValuesForKeys:@[@"name", @"age"]];
  • 对象属性赋值
// 直接赋值
stu.book.price = 20.0;
// 通过 KVC 赋值
[stu.book setValue:30.0 forKey:@"price"];
// 通过 KVC 键路径赋值
[stu setValue:40 forKeyPath:@"book.price"];

2. KVO(键值观察)简介

KVO 用于监听对象属性的变化,适用于需要追踪对象状态变化的场景。通过注册观察器,可以在属性值变化时执行相应的操作。

2.1 KVO 的实现步骤

  • 创建监听对象
Teacher *teacher = [[Teacher alloc] init];
  • 注册观察器
[stu addObserver:teacher forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
  • 监听器方法实现
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"属性:%@,值:%@", keyPath, change);
}

3. 实际案例

3.1 学生类的 KVC 应用

Student *stu = [[Student alloc] init];
[stu setValue:@"李斯" forKey:@"name"];
NSLog(@"修改后的姓名:%@", stu.name);

3.2 教师类的 KVO 实现

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"keyPath: %@, object: %@, change: %@", keyPath, object, change);
}

4. 代码示例

4.1 Book 类

@interface Book : NSObject
@property (nonatomic, assign) double price;
@end

4.2 Student 类

@interface Student : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) Book *book;
@end

4.3 Teacher 类

@interface Teacher : NSObject
@end

5. 主程序入口

int main(int argc, const char *argv) {
@autoreleasepool {
Student *stu = [[Student alloc] init];
[stu test];
}
return 0;
}

通过以上方法,开发者可以灵活地管理对象属性,并通过 KVO 实现属性值的监听功能。

转载地址:http://yfhfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现状态模式(附完整源码)
查看>>
Objective-C实现狄克斯特拉算法(附完整源码)
查看>>
Objective-C实现狄克斯特拉算法(附完整源码)
查看>>
Objective-C实现猜数字游戏(附完整源码)
查看>>
Objective-C实现猜数字算法(附完整源码)
查看>>
Objective-C实现猴子爬山算法(附完整源码)
查看>>
Objective-C实现环形缓冲区(附完整源码)
查看>>
Objective-C实现生产者和消费者问题(附完整源码)
查看>>
Objective-C实现生产者消费者问题(附完整源码)
查看>>
Objective-C实现生成 Mandelbrot 曼德勃罗集图像算法 (附完整源码)
查看>>
Objective-C实现生成崩溃dump文件 (附完整源码)
查看>>
Objective-C实现生成数组的所有不同排列算法(附完整源码)
查看>>
Objective-C实现生成正态分布数据(附完整源码)
查看>>