iOS ---- KVO的内部实现原理

Key-Value Observing (KVO)

KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制。

  [persion addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNew context:nil];

只要当前类中 age 这个属性发生的变化都会触发到以下的方法

- (void)observeValueForKeyPath:(NSString *)keyPath
  ofObject:(id)object
  change:(NSDictionary *)change
  context:(void *)context

同时不要忘记在dealloc中移除监听

-(void)dealloc{

    [self.persion removeObserver:self forKeyPath:@"age"];

}

下面就来看看它的实现原理

 

通过上面图片可以看出 当某个类第一次被监听时,系统会在运行时期动态地创建一个继承XqPersion的NSKVONOtifying_XqPersion类

在这个派生类中,重写基类中任何被观察属性的setter方法,在setter方法中实现真正的通知机制.

在该类中重写了监听属性的set方法,来通知监听器

- (void)setAge:(int)age

{

  [super setAge:age];

  [坚听器  observeValueForKeyPath:@"age" ofObject:self change:@{} context:nil];

}

时间: 2024-12-20 03:05:43

iOS ---- KVO的内部实现原理的相关文章

KVO的内部实现原理

Key-Value Observing (KVO) 首先我们先了解下 KVO 的机制,KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制. 例如:   [persion addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; 只要当前类中 age 这个属性发生的变化都会触发到以下的方法 - (void

iOS 的 KVC & KVO的底层实现原理

KVO 内部实现原理 1. KVO 是基于runtime机制实现的. 2. 当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法; 派生类在被重写的setter方法中实现真正的通知机制 (Person -> NSKVONotifying_Person) 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.

KVO内部实现原理

// // ViewController.m // KVO内部实现原理 // // Created by sw on 15/4/13. // Copyright © 2015年 sw. All rights reserved. // #import "ViewController.h" #import "Person.h" @interface ViewController () @end @implementation ViewController - (void

李洪强iOS开发之RunLoop的原理和核心机制

李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLo

iOS KVO概述

iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KVO? 答:KVO是Key-Value Observing的缩写.它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 如果你能这样回答,面试官一定不会说你错的,这就是KVO的原理.但是如果你能说出KVO

你不知道的KVO的内部实现

通过强大的Runtime 实现.第一次观察某个Object 时,runtime 会创建一个新的继承自 object 对应Class 的 subClass.在这个新subClass 里它重写了被观察的key(属性)的setter 方法.然后将object 指向原来对应Class 的isa指针指向了新创建的subClass[原因很简单,实例对象保有变量,而向对象发消息实际是那isa 去类对象里找对应的实例方法去了.即重写的setter 方法]: 这些被重写的setter 实现了如何通知观察者们. 有

IOS 图片轮播实现原理 (三图)

IOS 图片轮播实现原理的一种 图片轮播所要实现的是在一个显示区域内通过滑动来展示不同的图片. 当图片较少时我们可以采用在滚动视图上添加很多张图片来实现. 但是如果图片数量较多时,一次性加载过多图片会浪费内存,影响性能. 因此我们要采取适当地方法来实现图片的轮播. 下面我们只是简单的介绍很多方法中的一种简单的实现原理. 一 二 三 四 五 六 七

iOS中xib与storyboard原理,与Android界面布局的异同

用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML可以理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中主要的布置界面的方式有3种:代码,xib,storyboard. 1. 代码 代码布置界面是万能的,但通常很复杂.布置一个简单的界面可能需要很多行代码,因此十分繁琐. 下面为创建一个按钮的代码,最少也要3行: UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd

ArrayList内部实现原理

ArrayList内部实现原理 java list 首先,我们new一个对象list集合 List<String> list = new ArrayList<>(); 我们知道对象的创建离不开构造方法,因此我们查看ArrayList源码的时候先看其构造方法 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Object[] elementData; // non-priva