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)viewDidLoad {
    [super viewDidLoad];

//    KVO == Key Value Observing
//    作用: 可以监听某个对象属性的改变

    Person *p = [Person new];
    p.name = @"ws";
    p.age = 30;

    /*
     第一个参数: 告诉系统哪个对象监听
     第二个参数: 监听当前对象的哪个属性
     第三个参数: 监听到属性改变之后, 传递什么值
     第四个参数: 需要传递的参数 (这个参数不是传递给属性的)
     */
    // 给p这个对象添加一个监听 , 监听p对象的age属性的改变, 只要age属性改变就通知self
    [p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

    p.age = 50;

    NSLog(@"-------------------");

//    p.age = 100;

    // 注意: 如果使用KVO监听某个对象的属性, 当对象释放之前一定要移除监听
    //  reason: ‘An instance 0x7f9483516610 of class Person was deallocated while key value observers were still registered with it.
    // 注意: KVO只能监听通过set方法修改的值
    /*
     KVO的原理:
     只要给一个对象注册一个监听, 那么在运行时, 系统就会自动给该对象生成一个子类对象,
     并且重写自动生成的子类对象的被监听属性的set方法, 然后在set方法中通知监听者
     NSKVONotifying_Person
     */
    p->_age = 998;

    // 从p对象上移除self对它的age属性的监听
    [p removeObserver:self forKeyPath:@"age"];

}

// 只要监听到属性的改变就会调用
// keyPath: 被监听的属性名称
// object : 被监听的对象
// context: 注册监听的时候传入的值
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context
{
    NSLog(@"keyPath = %@, object = %@ , change = %@, context = %@", keyPath, object, change, context);
}

@end
时间: 2024-08-25 21:40:09

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

ios KVO的实现原理

首先给大家介绍一下KVO的使用场景:当某个对象的某个属性改变的时候,需要我们做出相应的处理事件.比如我们自定义下拉刷新,那么我们是如何得知用户要进行的下拉刷新数据操作呢,我们可以监听控件的frame,通过用户下拉该控件的时候,会修改该控件的frame.y属性,我们使用KVO监听这个属性.当这个属性的y值在某个范围,我们认为是下拉刷新操作.我们可以去进行数据请求.因为现在下拉刷新的第三方框架有很多,所以很少有人关注下拉刷新的实现原理. 又比如,我们经常使用的网络请求的第三方AFN,它内部监听网络下

KVO的实现原理

摘自:iOS--KVO的实现原理与具体应用 1 KVO是什么? KVO是Objective-C对观察者模式的一种实现,另外一种是通知机制(notification) KVO提供一种机制,指定一个被观察对象(例如A类),当对象的某个属性(例如A中的字符串name)发生更改时,对象会获得通知,并做出相应的处理. 在MVC设计架构下的项目,KVO机制很适合实现model模型和view视图之间的通讯. 例如:代码中,在模型类A创建属性数据,在控制器中创建观察者,一旦属性数据发生改变,观察者就会收到通知,

ArrayList内部实现原理

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

LinkedList内部实现原理

LinkedList内部实现原理 java list 同ArrayList内部原理一样 我们先创建一个LinkedList对象LinkedList<String> li = new LinkedList<>();,然后查看其构造方法 transient Node<E> first; transient Node<E> last; public LinkedList() { } 比较尴尬的是在它的构造方法中什么也没有写.LinkedList的结构是**双向链表

Maven内部运行原理

原作者zlwen 原文链接 内部运行原理(二) maven至今还是Java编程语言构建的事实标准,大部分项目还在使用maven来进行构建,因此了解maven内部运行的原理对定位和分析问题还是很有裨益的.本篇文章主要介绍一些maven内部运行过程中的一些基本概念,相信看完后,对那么些刚刚接触maven的读者来说maven将不再陌生.??在具体分析项目构建的过程前,需要了解maven的一些基本概念,这些概念十分重要,请务必理解清楚后再看下文.基本概念主要有:POM,Lifecycle.这两个概念又会

关于SDWebimage的内部实现原理

SDWebimage的内部实现原理各路大神都已经剖析的很透彻了 我也来发一下希望大家共同讨论学习 1.入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片. 2.进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo: 交给 SDImageCache 从缓存查找图片是否已经下

利用反射模拟一个spring的内部工作原理

这个简单的案例是实行了登录和注册的功能,没有链接数据库. 在bean中id 是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\.... 1 package com.obtk.reflect; 2 3 public class Logon { 4 /** 5 * 帐号密码长度大于六位字符就成功,否则失败! 6 * */ 7 public String select(String name, String pass) { 8 if (name.length()

前端必读:浏览器内部工作原理

前端必读:浏览器内部工作原理 作者: Tali Garsiel  发布时间: 2012-02-09 14:32  阅读: 56974 次  推荐: 88   原文链接   [收藏] 目录 一.介绍 二.渲染引擎 三.解析与DOM树构建 四.渲染树构建 五.布局 六.绘制 七.动态变化 八.渲染引擎的线程 九.CSS2可视模型 英文原文:How Browsers Work: Behind the Scenes of Modern Web Browsers 一.介绍 浏览器可以被认为是使用最广泛的软

LINQ内部执行原理浅析

C#3.0 增加LINQ的特性 一.基本概念 LINQ,语言级集成查询(Language INtegrated Query) 经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段.程序员现在都已经认同像类(classes).对象(objects).方法(methods)这样的语言特性.考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来