NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)
NSNotificationCenter
//下面是不同类中需要实现的代码
1.[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sender:) name:@"刘冠" object:nil];//通知接收者(监听者)
-(void) sender:(NSNotification *)input
{
NSLog(@"%@",input.object) ;
}
//引用计数为0的情况下,当内存回收时会调用dealloc(C++析构函数,做最后的内存清理工作)方法
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"刘冠" object:nil];//要移除该通知监听
}
2.[[NSNotificationCenter defaultCenter] postNotificationName:@"刘冠" object:@"刘冠"];//通知发送者(被监听者)
通知的发送者可以为系统中已定义过的,我们只需注册监听,例如视频播放类MPMoviePlayerViewController中的暂停按钮,只需注册即可,例如
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fanction) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];监听视频停止
kvc与kvo(键值编码 键值观察)
#import <Foundation/Foundation.h>
#import "Teacher.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *student = [[Student alloc]init];
student.name = @"liuguan";
student.age = @"";
//一个非正式的 Protocol,提供一种机制来间接访问对象的属性
// [student setValue:@"liuguan" forKey:@"name"];//kvc
// [student setValue:@"30" forKey:@"age"];//kvc Teacher *teacher = [[Teacher alloc]init];
[teacher listening:student]; // [student setValue:@"liuguanNew" forKey:@"name"];//kvc
// [student setValue:@"33" forKey:@"age"];//kvc
student.name = @"liuguanNew";
student.age = @""; }
return ;
}
#import "Teacher.h" @implementation Teacher
//Key-Value Observing (KVO) 它能够观察一个对象的 KVC key path 值的变化。举个例子,用代码观察一个 Student 对象的 name、age 变化,
- (void)listening:(Student *)stu
{
_s = stu;//指向同一块地址
//给对象的的属性添加监听(注册)
//第一个stu代表被观察对象,第二个 self 要成为观察者的对象,第三个:被观察者对象属性的名字,第四个代表改变前后的值,最后一个直接设置nil
[stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil] ;
[stu addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil] ;
}
//只有被监控的值重新被赋值时,才调用此方法
//第一个形参keypath代表被观察者对象属性的名字,通过该参数可以判断是哪个属性发生了改变,参数二:被观察者对象 参数三:改变前后的值的字典
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"Path%@",keyPath);
NSLog(@"Object%@",object);
NSLog(@"change%@",change);
NSLog(@"contex%@",context);
}
//引用计数为0的情况下,当内存回收时会调用dealloc(C++析构函数,做最后的内存清理工作)方法
-(void)dealloc{
[_s removeObserver:self forKeyPath:@"age"];//移除
[_s removeObserver:self forKeyPath:@"name"];//移除}
}
@end
NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)的更多相关文章
- iOS key value coding kvc在接收json数据与 model封装中的使用
iOS key value coding kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...
- NSNotificationCenter通知中心
概述 NSNotificationCenter通知中心,通常用于一对一或者一对多的消息传递,即当一个地方改变时,要求改变其他的一些地方,例如当网络请求回来了新的数据,需要刷新本地信息和本地内存里面的界 ...
- 'NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value coding compliant
解决一个问题: 当我添加一个IBout, 报了如下错误 NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value codi ...
- setValue:forUndefinedKey this class is not key value coding-compliant for the key
下午开发过程中遇到一个错误,结果被的真惨,从上午 11 点查错一直查到下午 2 点才找到错误的原因,真的郁闷的不行. 关于查错这么久,主要的原因是: 1. 自己对 IOS 开发还不熟悉2. 不知道 ...
- 数据库操作提示:Specified key was too long; max key length is 767 bytes
操作重现: 法1:新建连接——>新建数据库——>右键数据库导入脚本——>提示:Specified key was too long; max key length is 767 by ...
- Mysql Specified key was too long; max key length is 767 bytes
今天导入一个数据库时,看到以下报错信息: Specified key was too bytes 直译就是索引键太长,最大为767字节. 查看sql库表文件,发现有一列定义如下: 列 名:cont ...
- iOS: setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.
这里指抛出一个假设: 如 果你在 storyboard中, 通过 Ctrl - Drag 方式声明了一个 @property , 但你又觉得 在 Ctrl - Drag 时 ,命名的proper ...
- Specified key was too long; max key length is 767 bytes mysql
Specified key was too long; max key length is 767 bytes 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该 ...
- 'NSUnknownKeyException' this class is not key value coding-compliant for the key XXX
错误: Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefi ...
随机推荐
- SVN——配置和安装
SVN安装步骤: 所有安装文件下载地址:http://pan.baidu.com/s/1bocNTDl 一.安装01----VisualSVN-Server-3.4.2-x64.msi 文件 直接下一 ...
- rhel7修改网卡命名规则
1步:当安装完红帽RHEL7系统安装完成,您的网卡命名是这样的. 第2步:请编辑网卡的配置文件 将”/etc/sysconfig/network-scripts/ifcfg-eno16777736“的 ...
- hibernate的Criteria条件查询
项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来 1.初解 快速浏览了资料,大致了解了以下的内容: 1. Hibernate 定义了Crite ...
- ListView适配器获取布局文件作为View的三种方式
第一种方法: public View getView(int position, View convertView, ViewGroup parent) { View view = null; if ...
- Android Toast效果设置
Android Toast效果设置 Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.总 ...
- Django - 获取请求方式
//获取请过来得得请求类型 method = request.method 通过Django 的form 判断用户输入是否通过验证 check = forms.LoginFrom(request.PO ...
- poj2631 树的直径
设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...
- mysql命令-use
use命令可以让我们来使用数据库. use命令格式: use <数据库名>; 例如,如果xhkdb数据库存在,尝试存取它: mysql> use xhkdb; 屏幕提示:Databa ...
- 「个人vim插件+配置」
2016.10.4 filetype indent on syntax on set nu ai ci si set sw= ts= set autochdir set backspace= colo ...
- wamp服务下部署禅道或其它项目时访问缓慢的解决办法
原因其实很简单: WAMP服务默认是不支持外网访问的,如果公司内外网在一起就会引起缓慢甚至超时的问题,直接修改WAPM的配置文件让它可以访问外网即可解决问题. 解决的方法/步骤 1.解决办法: ...