博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS KVC/KVO/KVB
阅读量:6682 次
发布时间:2019-06-25

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

看了那么多博客。描述那么复杂,其实KVC很简单,没描述的那么复杂,所以写一篇简单的易于理解的博文,切入正文:

1.KVC底层是通过runtime对method和value操作

 比如说如下的一行KVC的代码:
[sit setValue:@"sitename" forKey:@"name"];
就会被编译器处理成:
SEL sel = sel_get_uid ("setValue:forKey:");
IMP method = objc_msg_lookup (site->isa,sel);
method(site, sel, @"sitename", @"name”);
前两步就是通过rt找到method,最后一步更新值;
2.KVO就是基于KVC添加了消息通知,观察者模式;
3.KVB 两个基本方法
1:为对象添加观察者OBserver
 
2:观察者OBserver收到信息的处理函数
 
以下是使用Demo
1.直接在VC里面操作属性/变量(不推荐耦合度不好)
@property (nonatomic,strong) NSString *str1;
在viewDidLoad加入:
[self addObserver:self forKeyPath:@"str1" options:NSKeyValueObservingOptionNew context:nil];//第一步
[self setValue:@"草泥马KVO" forKey:@"str1”];//第二步
//回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if([keyPath isEqualToString:@"count"]){
        NSLog(@"count : %@",[change valueForKey:@"new"]);
    }
    
    if([keyPath isEqualToString:@"str1"]){
        NSLog(@"str1: %@",[change valueForKey:@"new"]);
    }
}
在第一步添加注册元素@“str1",然后第二步改变其值,此时第三步回调方法就会响应;
2.自定义类 OberserClass 
#import <Foundation/Foundation.h>
@interface OberserClass : NSObject
@property (nonatomic,assign) int count;
@end
#import "OberserClass.h"
@implementation OberserClass
@end
简单添加一个属性,什么也不做。然后在ViewDidLoad加入以下代码:
    cls = [[OberserClass alloc]init];//cls必须是成员变量,不能是局部变量
    [cls addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew context:nil];
    [cls setValue:@"456" forKey:@"count"];
执行到最后一步observeValueForKeyPath就会收到通知,处理@“count"
3.自定义类内部处理
和第二种不一样的是,在@implementation添加如下代码:
- (void)setCount:(int)count{
    _count = count;
    [self  addObserver:self forKeyPath:@"count" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if([keyPath isEqualToString:@"count"]){
        NSLog(@"count is :");
    }
}
@end

 

demo下载地址:

转载于:https://www.cnblogs.com/Yukang1989/p/4117206.html

你可能感兴趣的文章
行为、审计日志 (实时索引/实时搜索)建模 - 最佳实践 2
查看>>
《Python密码学编程》——1.9 不用纸质工具做加密
查看>>
shell编程- 键盘输入变量
查看>>
apache commons-io
查看>>
Android 6.0 Marshmallow tips and tricks 棉花糖的技巧和窍门
查看>>
10年研发老兵:如何构建适合自己的DevOps工具与平台
查看>>
【设计模式】模板方法模式
查看>>
【阿里云资讯】北京云栖大会,阿里云资深技术总监李津谈全球云计算竞争力...
查看>>
【linux系统优化】Selinux介绍及关闭方法
查看>>
.NET中异常处理的最佳实践(译)
查看>>
MyEclipse8.5手动安装adt
查看>>
Linux_NetworkManager_RHEL7
查看>>
PHP并发 任务队列(2)
查看>>
RFC2119:表示要求的动词
查看>>
面向设计原则理解
查看>>
GET RESTful With Python
查看>>
ExtJs之Ext.apply
查看>>
Swift教程_CoreData实例(五)_构建控制层(添加数据)
查看>>
[精通Objective-C]类,接口,协议与扩展
查看>>
[前端]使用JQuery UI Layout Plug-in布局
查看>>