kvo-观察者-iOS

#import <Foundation/Foundation.h>

@interface Child : NSObject
@property (nonatomic,assign) int age;
-(id) initWithAge:(int) age;
@end
#import "Child.h"

@implementation Child
-(id) initWithAge:(int) age{
    self=[super init];
    if(self!=nil){
        _age=age;
    }
    return self;
}
@end
#import <Foundation/Foundation.h>
@class Child;
@interface Nurse : NSObject
@property Child *child;
-(id)initWithChild:(Child *) child;
-(void) observeChild;
-(void) removeObserver;
@end
#import "Nurse.h"
#import "Child.h"

@implementation Nurse
#import "Child.h"
-(id)initWithChild:(Child *) child{
    self=[super init];
    if(self!=nil){
        _child=child;
//         [_child addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"孩子长大一岁了"];
    }
    return self;
}

-(void) observeChild{
    [_child addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
        NSLog(@"观察者创建好了");
}

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    NSLog(@"孩子现在的年龄:%@",[change objectForKey:@"new"]);
}

-(void) removeObserver{
[_child removeObserver:self forKeyPath:@"age"];
     NSLog(@"观察者移除掉了");
}

@end
    //kvo--观察者
        Child *child=[[Child alloc] initWithAge:23];
        Nurse *nurse=[[Nurse alloc] initWithChild:child];
        [nurse observeChild];
        [child setAge:24];
        [child setAge:25];
        [nurse removeObserver];

kvo-观察者-iOS

时间: 2024-08-25 01:00:25

kvo-观察者-iOS的相关文章

iOS 自动移除KVO观察者

对NSObject写一个分类: #import <Foundation/Foundation.h> @interface NSObject (FMObserverHelper) - (void)fm_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; @end //  对象被释放之前, 会调用dealloc方法, 其持有的实例变量也会被释放. //  在监听注册时, 为self和Observer关联个临时对象, 当两

KVO之IOS学习-设计模式

KVO 即Key-Value Observing  键-值观察的缩写,简单的说就是通过键来观察一个对象属性值的变化.当这个被观察的属性发生变化时,观察者就会收到通知(观察者可以是这个对象本身,也可以是其他对象). 下面来模拟KVO的实现过程: 创建一个People类,其有俩个属性name,sex -----------------------People.h文件中---------------------------- #import <Foundation/Foundation.h> @in

iOS开发——KVO/KVC&amp;OC与Swift篇详解

Swift中使用KVC和KVO的类都必须必须继承自NSObject KVC key-value coding 是1种间接访问对象的机制 key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型 KVC主要就是两个方法 (1)通过key设置对应的属性 (2)通过key获得对应的属性 举例 class TestForKVC:NSObject{ var hwcCSDN = "hello world" } var instance = TestForKVC() va

iOS: 消息通信中的Notification&amp;KVO

iOS: 消息通信中的Notification&KVO 在 iOS: MVC 中,我贴了张经典图: 其中的Model向Controller通信的Noification&KVO为何物呢? 在功能上说,delegate.Notification以及KVO的功能类似,都是作用于 OC中对象 的消息通信.但三者的使用场景是不同的. 简单的说Delegate是一种回掉函数,更多的用在一对一的场合,可参考 iphone:delegate机制 : Notification 用得较少,使用Notifica

iOS 关于NSNotificationCenter

通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,  Apple 还为我们提供了另一种通知响应方式,那就是 NSNotification. NSNotificationCenter 较之于 Delegate 可以实现更大的跨度的通信机制,可以为两个无引用关系的两个对象进行通信.NSNotificationCenter 的通信原理使用了观察者模式(KVO):三步骤  1在需要实施的地方注册  2并 写好触发的事件  3在需要触发该事件的地方激发 1. NSNotifica

iOS runtime实战应用:关联对象

在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇到这样一个问题:"如何給NSArray添加一个属性(不能使用继承)",筒子立马蒙逼了,不能用继承,难道用分类?但是分类貌似只能添加方法不能添加属性啊,筒子百思不得其解,直到后来接触到了runtime才恍然大悟. 什么是关联对象 关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上.举个例子:xiaoming是Person类的一个实例,他的dog(一个OC对象)通过一根

iOS开发——实用技术OC篇&amp;各种传值方式总结

单例 //.h  1 + (Instannce *)shareInstance;  //.m 1 static Instannce *instance = nil; 2 @implementation Instannce 3 //定义一个创建单例对象的方法 4 + (Instannce *)shareInstance { 5 if (instance == nil) { 6 instance = [[Instannce alloc] init]; 7 } 8 return instance; 9

iOS中的MVC

我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型.我们将从两大方面来讨论MVC: 什么是MVC? M.V.C之间的交流方式是什么样子的? 理解了MVC的概念,对cocoa程序开发是至关重要的. 一.MVC的概念 MVC是Model-VIew-Controller,就是模型-视图-控制器,这些都是什么东西呢? MVC把软件系统分为三个部分:Model,View,Controller.在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不

Objective-C:KVO

KVO(键值观察)是Objective-C提供的一种观察对象属性变化的机制,其内部是利用KVC技术来实现观察者设计模型.利用KVO用户可以注册一个对象为另一个对象的观察者,并在被观察对象的属性发生变化时能收到通知. 1 使用KVO 利用键值观察(Key Value Observing),可以自动观察其他对象的变化.因此,当一个对象改变状态(属性)时,其它对象就会得到通知.通过键值观察,你不需要手动告诉其他对象进行更新.它们会自动收到新值并执行适当的操作.这极其强大.设置是该技术最强大的应用之一,

图片异步加载 ,KVO

图片异步下载类目: .h #import <UIKit/UIKit.h> typedef void (^ImageBlock)(UIImage *img); @interface UIImage (ImageDown) //第一个参数获得一个url的字符串(图片) //第二参数 block块是用来将解析出来的image进行第二次赋值 +(UIImage *)imageDownWithUrlString:(NSString *)urlString imageBlock:(ImageBlock)i