如何自己动手实现 KVO(转)】的更多相关文章

KVO (Key-Value Observing) KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现.也是 Cocoa Binding 的基础.当被观察对象的某个属性发生更改时,观察者对象会获得通知. 有意思的是,你不需要给被观察的对象添加任何额外代码,就能使用 KVO .这是怎么做到的? KVO 实现机制 KVO 的实现也依赖于 Objective-C 强大的 Runtime .Apple 的文档有简单提到过 KVO 的实现: Automatic ke…
前言 KVO(Key-Value Observing, 键值观察), KVO的实现也依赖于runtime. 当你对一个对象进行观察时, 系统会动态创建一个类继承自原类, 然后重写被观察属性的setter方法. 然后重写的setter方法会负责在调用原setter方法前后通知观察者. KVO还会修改原对象的isa指针指向这个新类. 我们知道, 对象是通过isa指针去查找自己是属于哪个类, 并去所在类的方法列表中查找方法的, 所以这个时候这个对象就自然地变成了新类的实例对象. 不仅如此, Apple…
来源:伯乐在线 - Jerry4me 链接:http://ios.jobbole.com/88828/ 点击 → 申请加入伯乐在线专栏作者 我的Github地址 : https://github.com/Jerry4me 本文章的demo链接 : https://github.com/Jerry4me/JRCustomKVODemo 前言 KVO(Key-Value Observing, 键值观察), KVO的实现也依赖于runtime. 当你对一个对象进行观察时, 系统会动态创建一个类继承自原…
入门篇 KVO是什么? Key-value observing is a mechanism that allows objects to be notified of changes to specified properties of other objects. KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现.也是 Cocoa Binding 的基础.当被观察对象的某个属性发生更改时,观察者对象会获得通知,并且得知此时这个属性的具体值. 有点绕口…
一.KVO (Key-Value Observing) KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现.也是 Cocoa Binding 的基础.当被观察对象的某个属性发生更改时,观察者对象会获得通知. 有意思的是,你不需要给被观察的对象添加任何额外代码,就能使用 KVO .这是怎么做到的? 二. KVO内部实现原理 KVO是基于runtime机制实现的 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基…
  目录 关于面试 官方文档 核心代码 (Key-Value Observing) 进阶(手动创建KVO) 关于isa指针 参考文章链接 一.关于面试 面试官:谈一谈你对KVO的理解? A:添加响应者,监听对象变化,当对象改变时调用代理. B:动态创建NSKVONotifying_XX类,修改被监听对象isa指针指向,只要调用对象的set方法, 就会调用NSKVONotifying_XX的set方法.本质:判断对象的set方法有没有被调用, 二.苹果官方文档描述 Automatic key-va…
一个区分度很大的面试题 考察一个面试者基础咋样,基本上问一个 @property 就够了: @property 后面可以有哪些修饰符? 线程安全的: atomic,nonatomic 访问权限的 readonly,readwrite 内存管理(ARC) assign,strong,weak,copy 内存管理(MRC) assign,retain,copy 指定方法名称 setter= getter= 什么情况使用 weak 关键字,相比 assign 有什么不同?比如: 在ARC中,出现循环引…
    自定义导航按钮UIBarButtonItem   关于导航栏的六个小技巧   ios开发的一些小技巧篇一 制作一个可以滑动操作的 Table View Cell - IOS - 伯乐在线 一个iOS开发者的修真之路 - IOS - 伯乐在线 iOS性能优化 - IOS - 伯乐在线 block没那么难(一):block的实现 - 作业部落 Cmd Markdown 编辑阅读器 ARC 下内存泄露的那些点 - 作业部落 Cmd Markdown 编辑阅读器 产品经理日常工作职责分析与整理…
KVO内部实现原理 1.KVO是基于runtime机制实现的. 2.当某个类的对象第一次被观察是,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的set方法.派生类在被重写的setter方法实现真正的通知机制(-->>NSKVONotifying_类名); 苹果不希望这个机制暴露在外部.除了setter,这个动态生成的子类同时也重写了-class方法,依旧返回原先的class!如果不仔细看的话,被KVO过的object看起来和原先的object没什么两样.…
李洪强iOS经典面试题下 21. 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self; } @end 答案: 都输出 Son NSS…
1. 风格纠错题 修改方法有很多种,现给出一种做示例: 最终改为: 下面对具体修改的地方, 2. 什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 1)在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如:delegate代理属性 2)自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak:当然,也可以使用strong.在下文也有论述:<IBOutl…
1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/   2. 使用crashlytics来保存应用崩溃信息:http://blog.devtang.com/blog/2013/07/24/use-crashlytics/   3. iOS开发工具篇,AppStore统计工具:http://blog.devtang.com/blog/2013/06/16/ios-dev…
相关文章: <招聘一个靠谱的iOS>面试题参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 出题者简介: 孙源(sunnyxx),目前就职于百度,负责百度知道 iOS 客户端的开发工作,对技术喜欢刨根问底和总结最佳实践,热爱分享和开源,维护一个叫 forkingdog 的开源小组. 答案为微博@iOS程序犭袁整理,未经出题者校对,如有纰漏,请向微博@iOS程序犭袁指正. 2…
runtime runtime用在什么地方? 说法 在程序运行过程中,动态的创建一个类(比如KVO的底层实现) 在程序运行过程中,动态地为某个类添加属性.方法,修改属性值\方法(method swizzing) 遍历一个类的所有成员变量(属性)\方法 例如:我们需要对一个类的属性进行归档的时候,属性特别多,我们就会写很多对应的代码,但是如果使用了runtime就可以动态的设置 objc_msgSend : 给对象发送消息 class_copyMethodList : 遍历某个类所有的方法 cla…
iOS面试知识点 现在进入本篇的正题.本篇的面试题是我认为比较好的iOS开发基础知识点,希望大家看过这后在理解的基础上掌握而不是死记硬背.死记硬背很快也会忘记的. 1 iOS基础 1.1 父类实现深拷贝时,子类如何实现深度拷贝.父类没有实现深拷贝时,子类如何实现深度拷贝. 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,那么就是有两个指针指向同一个对象,这个对象销毁后两个指针都应该置空.深拷贝是对一个对象进行拷贝,相当…
李洪强iOS经典面试题30-一个区分度很大的面试题 考察一个面试者基础咋样,基本上问一个 @property 就够了: @property 后面可以有哪些修饰符? 线程安全的: atomic,nonatomic 访问权限的 readonly,readwrite 内存管理(ARC) assign,strong,weak,copy 内存管理(MRC) assign,retain,copy 指定方法名称 setter= getter= 什么情况使用 weak 关键字,相比 assign 有什么不同?比…
很早就知道了Objective-C Runtime这个概念,「Objective-C奇技淫巧」「iOS黑魔法」各种看起来很屌的主题中总会有它的身影:但一直没有深入去学习,一来觉得目前在实际项目中还没有必要了解,二来懒.但,若想成为一个合格的iOS开发者,这个东西是躲不过的,好吧,抡起胳膊开始吧,争取一点点把它整明白吧!和了解其他技术一样,在了解一个东西之前,我总是问自己,这个有啥实际意义?为什么要了解她?多自问一些问题,找到实际意义,在理解上总会容易一些,学习也自然更有目的性一些. 看了十几篇博…
iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KVO? 答:KVO是Key-Value Observing的缩写.它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. 如果你能这样回答,面试官一定不会说你错的,这就是KVO的原理.但是如果你能说出KVO…
序言 在iOS开发中,苹果提供了许多机制给我们进行回调.KVO(key-value-observing)是一种十分有趣的回调机制,在某个对象注册监听者后,在被监听的对象发生改变时,对象会发送一个通知给监听者,以便监听者执行回调操作.最常见的KVO运用是监听scrollView的contentOffset属性,来完成用户滚动时动态改变某些控件的属性实现效果,包括渐变导航栏.下拉刷新控件等效果. 渐变导航栏 使用 KVO的使用非常简单,使用KVO的要求是对象必须能支持kvc机制--所有NSObjec…
转自:http://www.jianshu.com/p/742b4b248da9 序言 在iOS开发中,苹果提供了许多机制给我们进行回调.KVO(key-value-observing)是一种十分有趣的回调机制,在某个对象注册监听者后,在被监听的对象发生改变时,对象会发送一个通知给监听者,以便监听者执行回调操作.最常见的KVO运用是监听scrollView的contentOffset属性,来完成用户滚动时动态改变某些控件的属性实现效果,包括渐变导航栏.下拉刷新控件等效果. 渐变导航栏 使用 KV…
一.介绍 什么是KVO?全称key-value-observer,键值观察,观察者设计模式的另一种实现.其作用是通过观察者监听属性值的变化而做出函数回调. 二.原理 KVO基于Runtime机制实现,使用了isa的混写技术 监听者监听类A的某一个属性的变化,系统会动态为类A创建一个子类NSKVONotifying_A,并将类A的isa指针重新指向该子类 系统会重写类A的setter方法.( 赋值前后分别调用willChangeValueForKey和didChangeValueForKey跟踪新…
Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的js框架去实现它. 如果你还是一个Chrome插件的新手并且想尝试写一个的话,下面的文章将会带领大家并且尝试让大家理解Chrome插件的工作机制.这篇文章将会讲述每一块架构,以及相互之间的联系和插件的一般化形式. 架构 Chrome插件中的文件大体上可以分成2部分:Chrome插件中确确实实存在的文…
看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法.我把这个过程中的一些了解和想法记录下来和大家一起分享.首先我用IntelliJ-Idea创建了一个scala项目.下一步就是如何选择数据库了.Slick是集成jdbc的更高层的Query编程语言,可以通过jdbc的url.DataSource等来指定目标数据库类型及相关的参数.对应Slick中的具体函数有: val db = Database.forConfig("mydb&q…
loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达.最常见的比如"转圈圈","省略号"等等. 网页loading有很多用处,比如页面的加载进度,数据的加载过程等等,数据的加载loading很好做,只需要在加载数据之前(before ajax)显示loading效果,在数据返回之后(ajax completed)结束loading效果,就可以了. 但是页面的加载进…
各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linux中简单的部署自己的WebForm程序和ASP.NET MVC应用程序.如果各位读者有阅读该系列的文章并且成功的实现上面的每一个功能点,那么小弟认为,你对Linux.NET已经入门,剩下的就是各自在Linux.NET中自由发挥,在这另一天地中做自己爱做的事,创出一番更新的新天地来. 为此,在下推出一个新的系列…
前言:       毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环境跑起来,然后在能用的基础上在多想想为什么.       通过这三个礼拜(基本上就是周六周日,其他时间都在加班啊T T)的探索,我目前主要完成的是: 1.在Linux环境中伪分布式部署hadoop(SSH免登陆),运行WordCount实例成功. http://www.cnblogs.com/Pur…
文章结构如下: Why? (为什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) More (更多细节) 原理 自己实现KVO 在我的上一篇文章浅谈 iOS Notification中,我们说到了iOS中观察者模式的一种实现方式:NSNotification 通知,这次我们再来谈谈iOS中观察者模式的另一种实现方式:KVO . Why? 假如,有一个person类,和一个Account类,account类中又有两个公开的属性,balance和interestRate,当…
前言 上一篇文章<Unity3D中常用的数据结构总结与分析>简单总结了一下小匹夫工作中经常遇到的一些数据结构.不过小匹夫一直有种观点,就是光说的热闹实际啥也不做真的没啥意思.光说不练假把式,那么这篇文章不如记录一下小匹夫自己动手实现一个有类似功能的数据结构的过程吧. 模仿List<T> 寻思半天,写代码是为了啥?不是为了写以致用嘛?那么小匹夫工作中用的最多的数据结构是啥?思来想去还就是List<T>了,而且平时使用的时候的确也觉得有自己定制的空间.作为一个类,重要的无非…
前言: 首先,小匹夫要祝各位看官圣诞快乐,新年愉快-.上一篇文章<自己动手,实现一种类似List<T>的数据结构(一)> 介绍了一下不依靠List<T>实现的各种接口,仿造一个轻量级数据结构的过程.可能有的看官会有一些疑问,例如一些功能可以通过Linq提供的拓展来实现呀.此言不虚但也不全对,为了我们在工作中能方便的操作集合而提供的这些拓展方法(包括我们自己也可以构建的拓展方法),例如 Where,Any,Max,All...balalbala等等这些方法都是针对IEnu…
1,KVC(键值编码)  Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进行读写. 1.2KVC的操作方法由NSKeyValueCoding协议来定义,而Object对象实现该协议,所以所有的对象都具有KVC功能 动态设置:setValue:属性值 forKey:属性名    setValue: 属性值forKeyPath:属性路径 动态读取:valueForKey:属性…