您的位置:首页 > 产品设计 > UI/UE

NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)

2015-11-23 15:40 239 查看
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 = @"30";
//一个非正式的 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 = @"32";

}
return 0;
}
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: