当前位置: 首页 > news >正文

[objective-c]关于KVC--KVO--KVB

概述:都是以[KVC]key-Value Coding   为基础 

Key-Value Coding(KVC)实现分析

    KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa- swizzling,来实现其内部查找定位的。isa指针,如其名称所指,(就是is a kind of的意思),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。

    比如说如下的一行KVC的代码:

[site setValue:@"sitename" forKey:@"name"];


就会被编译器处理成:

SEL sel = sel_get_uid ("setValue:forKey:");
IMP method = objc_msg_lookup (site->isa,sel);
method(site, sel, @"sitename", @"name");


首先介绍两个基本概念:

    (1)SEL数据类型:它是编译器运行Objective-C里的方法的环境参数。

    (2)IMP数据类型:他其实就是一个 编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型(事实 上,在Objective-C的编译器处理的时候,基本上都是C语言的)。

这下KVC内部的实现就很清楚的清楚了:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参 数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。

Key-Value Observing机制的概述

Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察 者。

KVO的优点

当有属性改变,KVO会提供自动的消息通知。这样的架构有很多好处。首先,开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。这 是KVO机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。开发人员不需要添加任何代码,不需要设计自己的观察者模 型,直接可以在工程里使用。其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值。


KVB
两个基本方法
1:为对象添加观察者OBserver
addObserver:forKeyPath:options:context: 

2:观察者OBserver收到信息的处理函数
observeValueForKeyPath:ofObject:change:context: 






MVC架构是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。 Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性, 所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。

  MVC架构最早是smalltalk语言研究团提出的,应用于用户交互应用程序中。

  MVC模式是一个复杂的架构模式,其实现也显得非常复杂。但是,我们已经总结出了很多可靠的设计模式,多种设计模式结合在一起,使MVC模式的 实现变得相对简单易行。Views可以看作一棵树,显然可以用Composite Pattern来实现。Views和Models之间的关系可以用Observer Pattern体现。Controller控制Views的显示,可以用Strategy Pattern实现。Model通常是一个调停者,可采用Mediator Pattern来实现。


KVC--KVO--KVB优势
些机制通过规定了一组通用的Cocoa命名法则、调用规则等,实现了如下功能:   1. 使用一对高度规范化的访问方法,获取以及设置任何对象的任何属性的值(所谓的属性既可以是个实实在在的成员变量,也可以是通过一对成员方法所抽象出的该对 象的一个性质)。   2. 通过继承一个特定的方法,并且指定希望监视的对象及希望监视的属性名称,就能在该对象的指定属性的值发生改变时,得到一个“通知”(尽管这不是一个真正意 义上的通知),并且得到相关属性的值的变化(原先的值和改变后的新值)。   3. 通过一个简单的函数调用,使一个视图对象的一个指定属性随时随地都和一个控制器对象或模型对象的一个指定属性保持同步。

相关文章:

  • NSStringOC字符串
  • linux 升级kernel
  • 构建私有云和公有云的免费开源软件项目OpenStack
  • KNN算法介绍 | 沙湖王
  • MySQL主从同步设置和同步错误处理
  • Mysql note 2
  • Android拓展系列(8)--Vim插件便捷管理(使用git submodule和pathogen)
  • DHCP中继与vlan的隔离
  • poj 3041 Asteroids(二分图最小顶点覆盖)
  • linux下rsync+inotify实现文件时实同步
  • Windows批处理生成目录树
  • Linux中安装.rpm、.tar和.tar.gz或.tgz包
  • PHP Memcache(一):windows mencache安装
  • Linux内核Power Management配置注释
  • 惨痛的经历
  • 【译】理解JavaScript:new 关键字
  • Bootstrap JS插件Alert源码分析
  • JavaScript新鲜事·第5期
  • KMP算法及优化
  • MySQL几个简单SQL的优化
  • Octave 入门
  • Shadow DOM 内部构造及如何构建独立组件
  • Swift 中的尾递归和蹦床
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 判断客户端类型,Android,iOS,PC
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我的zsh配置, 2019最新方案
  •  一套莫尔斯电报听写、翻译系统
  • 在Mac OS X上安装 Ruby运行环境
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #define用法
  • (26)4.7 字符函数和字符串函数
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)共用体union的用法举例
  • (TOJ2804)Even? Odd?
  • (windows2012共享文件夹和防火墙设置
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (小白学Java)Java简介和基本配置
  • (转)【Hibernate总结系列】使用举例
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ..回顾17,展望18
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net framework4与其client profile版本的区别
  • .net6Api后台+uniapp导出Excel
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理