KVO

  • 让一个对象监听另一个对象属性的改变
// MJPerson.h
#import <Foundation/Foundation.h>
@interface MJPerson : NSObject

@property(nonatomic, assign)NSInteger age;

@end

// MJPerson.m
@implementation MJPerson
@end
// MJDog.h
#import <Foundation/Foundation.h>
@interface MJDog : NSObject
@end

// MJDog.m
#import “MJDog.h”
@implementation MJDog
@end
// MJViewController.h
#import <Foundation/Foundation.h>
@interface MJViewController : UIViewController
@end

// MJViewController.m
#import “MJViewController.h”
#import “MJPerson.h”
#import “MJDog”
@interface MJViewController () // 这是类扩展,类别的一种

@property (nonatomic, strong)MJPerson *person;
@property (nonatomic, strong)MJDog *dog;

@end

@implementation MJViewController

- (void)viewDidLoad {
  self.person = [[MJPerson alloc] init];
  self.dog = [[MJDog alloc] init];
  // 让self.dog监听self.person的age属性的改变
  [self.person addObsever:self.dog forKeyPath:@”age” options:0 context:nil];
}

- (void)touchesBegan:(NSSet *)touches withEvents:(UIEvent *)event {
  self.person.age = 30;
}

@end

KVO内部实现原理
运行过程中,系统会自动生成一个NSKVONortifying_MJPerson :MJPerson类,调用person的setAge方法,会调用子类的setAge方法,runtime中会使用到KVO。

// NSKVONortifying_MJPerson.h
#import “MJPerson.h”
@interface NSKVONortifying_MJPerson : MJPerson
@end

// NSKVONortifying_MJPerson.m
#import “NSKVONortifying_MJPerson.h”
@implementation NSKVONortifying_MJPerson

- (void)setAge:(int)age {
  [super setAge:age];
  [self willChangeValueForKey:@”age”];
  [self didChangeValueForKey:@”age”];
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 你要知道的KVC、KVO、Delegate、Notification都在这里 转载请注明出处 http://www...
    WWWWDotPNG阅读 1,827评论 1 3
  • 上半年有段时间做了一个项目,项目中聊天界面用到了音频播放,涉及到进度条,当时做android时候处理的不太好,由于...
    DaZenD阅读 3,045评论 0 26
  • 一、概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则其观察...
    DeerRun阅读 10,128评论 11 33
  • 利用Runtime 实现简单的自定义kvo 代码githubgithub.com/zswj/custom-KVO ...
    我是数据链路层阅读 875评论 1 0
  • 1.KVC 关于 KVC 和 KVO ,我之前的总结文章有写过,但是趋于表面,没有探究其内部真正的实现原理和进阶用...
    Liberalism阅读 1,112评论 0 5