运用runtime与AOP实现oc中的kvo

前言: oc中实现的kvo观察者模式比较呆板,不支持block,运用runtime机制将其进行实现。

详细实现步骤:

一:给NSObject添加分类(添加相应的添加观察者,删除观察者的方法),这样凡是继承NSObject的类生成的对象都会拥有这两个方法。

二:在添加观察者的方法中,检查本类是否有观察者想要观察的属性。如果有,进行下一步。

三:检查是否已经给该对象的这个属性的set方法进行了方法实现的替换,如果没有进行下一步,如有进行第五步。

四: 将这个属性的set方法的实现指向aop方法,并且添加一个相应的方法指向原有set方法的实现。

五:将观察者(可以是封装有观察者属性的对象,我就是封装了一个其他的类)添加到自己的字典中(我用的是一个字典,也可以是其他的模型) 。

六:书写aop方法,aop方法实现对原先set方法的调用, 并且实现对观察者的广播。(两个方法的调用顺序可以自定义,这就是aop前切和后切)

 提示: 

上述只是一个简单的流程步骤,留言提供源码,欢迎共同讨论学习。 

转载于:https://www.cnblogs.com/Sunnyheart/p/4979287.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS下IPTABLES配置详解

iptables是与Linux内核集成的IP信息包过滤系统,其自带防火墙功能,我们在配置完服务器的角色功能后,需要修改iptables的配置。配置CentOS和Ubuntu等linux服务器时需要对服务器的iptables进行配置,以下是iptables常见的几种配置方法…

mysql教程详解之多表联合查询,MYSQL教程mysql多表联合查询返回一张表的内容实现代码...

搜索热词《MysqL教程MysqL多表联合查询返回一张表的内容实现代码》要点:本文介绍了MysqL教程MysqL多表联合查询返回一张表的内容实现代码,希望对您有用。如果有疑问,可以联系我们。今天在使用MysqL语句的时候老是报错,语句如下:sq…

C#实现冒泡排序

一、算法原理 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3、针对所有的元素重复以上的步骤,除了最后一…

PHP - 使用 Pear 进行安装和卸载包

安装: 首先运行到php根目录: 输入要安装的包文件名: 使用语法: pear install 要安装包的名称 回车确认: 如果没有其他意外,显示安装成功。查看安装的包的信息: 语句: pear info 包的…

CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)

所有文章索引:CYQ.Data 轻量数据层之路 框架开源系列 索引 前言: 从V1.5发布到现在时隔20天了,终于发布2.0版本了,2.0系列版本由于引入多数据库支持,内部结构改动较大。 但是外面调用方式仍保持一致向下兼容&#xff0…

matlab 捕食者和猎物,MATLAB - 追求曲线(捕食者/猎物)

在我的工程课上,我们编写了一个“非平凡的”捕食者/猎物追捕问题。以下是情况的要点:有一个猎物试图逃脱捕食者。每个都可以建模为可以在MATLAB中制作动画的粒子(我们必须使用这种编码语言)。猎物:可以比捕食者更容易操纵(转弯)捕食者&#x…

SQL Server 2012安装图解

方法/步骤 在资源管理器中双击SQL Server 2012的安装光盘,此时会出现一个安装窗口,在左侧的界面中点击“安装”选项卡,如图所示。然后点击右边的第一项“全新SQL Server 独立安装...”选项。 点击“下一步”按钮继续下一步安装。耐心等待片刻…

C#中读写INI文件

INI文件就是扩展名为“ini”的文件。在Windows系统中,INI文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。该文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配…

html5响应式设置meta

1 <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <!--放大页面到设备合适的分辨率--> 若不支持&#xff0c;请使用兼容ie的js 1 <!--[if lt IE 9]> 2 <script src"http://css3-mediaqueries-js.goo…

jmap在ubuntu上DebuggerException: Can't attach to the process

解决&#xff1a; 临时&#xff1a; 1.echo 0 >/proc/sys/kernel/yama/ptrace_scope 永久&#xff1a; 2.修改 /etc/sysctl.d/10-ptrace.conf&#xff0c;设置kernel.yama.ptrace_scope0 参考&#xff1a;http://bugs.java.com/bugdatabase/view_bug.do?bug_id7050524转载于…

C/C++中对链表操作的理解实例分析

链表概述   链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量&#xff0c;以head表示&#xff0c;它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”&#xff0c;每个结点都应包括…

idea写java spark程序,Spark : 在IDEA中用scala编写Spark的WordCount程序并提交运行

使用IDEA新建maven工程&#xff0c;添加相关依赖&#xff1a;1.81.82.11.112.3.02.7.7utf-8org.scala-langscala-library${scala.version}org.apache.sparkspark-core_2.11${spark.version}org.apache.hadoophadoop-client2.7.7给项目添加scala支持&#xff0c;新建Scala Objec…

Contest - 2014 SWJTU ACM 手速测试赛(2014.10.31)

题目列表&#xff1a; 2146 Problem A【手速】阔绰的Dim2147 Problem B【手速】颓废的Dim2148 Problem C【手速】我的滑板鞋2149 Problem D【手速】潦倒的Dim2150 Problem E【手速】被NTR的Dim2146 Problem A&#xff1a; 简单的最长回文串统计算法&#xff0c;这里没有过高要求…

利用Vagrant and VirtualBox搭建core os环境

利用Vagrant and VirtualBox搭建core os环境 系统环境 ubuntu 14.04 x64vagrant 1.7.4virtualbox 4.3.10git 1.9.1# 安装 virtualbox, git sudo apt-get install virtualbox, git# 软件中心的vagrant版本太低,因此去官网获取最新的软件包地址 wget https://releases.hashicorp.…

php关注 取消关注事件,微信公众平台开发关注/取消关注事件例子

用户在关注与取消关注公众号时&#xff0c;微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑下面是一个微信公众平台关注和取消关注的实例:responseMsg();} else {$wechatObj->valid();}class wechatCallbackapiTest {public function…

DFS应用——遍历有向图+判断有向图是否有圈

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在 理解 “DFS应用——遍历有向图判断有向图是否有圈” 的idea 并用源代码加以实现 &#xff1b;0.2&#xff09; 判断有向图是否有圈的rule—— 一个有向图是无圈图当且…

AbleCloud智能行业解决方案助力体重秤企业向“中国智造”转变

近年来&#xff0c;体重秤消费群体的年龄层次与需求逐渐向多元化发展&#xff0c;品牌众多、竞争激烈的传统体重秤行业迎来了前所未有的挑战——智能体重秤成为行业发展的大趋势&#xff0c;功能单一、同质化严重已经成为阻碍传统体重秤企业成长的桎梏&#xff0c;打造出具备“…

javaScript事件(一)事件流

一、事件 事件是文档或者浏览器窗口中发生的&#xff0c;特定的交互瞬间。 事件是用户或浏览器自身执行的某种动作&#xff0c;如click,load和mouseover都是事件的名字。 事件是javaScript和DOM之间交互的桥梁。 你若触发&#xff0c;我便执行——事件发生&#xff0c;调用它的…

php输入对话框,如何使用JavaScript实现输入对话框

我们有时在网页上进行注册用户信息时会出现弹窗进行提示&#xff0c;你需要输入内容进行确认&#xff0c;那么&#xff0c;这样的输入对话框是怎么实现的呢&#xff1f;本篇文章就来介绍关于使用JavaScript实现输入对话框的方法。我们可以使用prompt显示输入对话框要在JavaScri…

软件缺陷的种类划分

按照软件缺陷的产生原因&#xff0c;可以将其划分为不同的缺陷类别&#xff1a; 1、功能不正常 简单地说就是所应提供的功能&#xff0c;在使用上并不符合产品设计规格说明书中规定的要求&#xff0c;或是根本无法使用。这个错误常常会发生在测试过程的初期和中期&#xff0c;有…