kvo

KVO

▼魔方 西西 提交于 2019-11-29 04:41:08
KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变 原理 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类 当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数 _NSSetXXXValueAndNotify的内部调用如下 调用willChangeValueForKey: 调用原来的setter实现 调用didChangeValueForKey;didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法 相关问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 答:如上 如何手动触发KVO? 当 +(BOOL)automaticallyNotifiesObserversForKey:(NSString )key 返回是 YES,那么注册的这个 Key 就会替换对应的 Setter ,从而在改变的时候调用 -(void)willChangeValueForKey:(NSString )key 与 -(void)didChangeValueForKey:(NSString *)key 发送通知给观察者

61 (OC)* 代理 block 通知 代理 kvo

别说谁变了你拦得住时间么 提交于 2019-11-28 15:05:55
1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高。 block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。就像C的函数指针,只多做了一个查表动作。 2.从使用场景区别block和delegate 有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。当1,2个回调时,则使用block。 delegate更安全些,比如: 避免循环引用。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。 delegate回调返回的参数被限制在了 NS 类的范围内,数量也很有限(当然可以用直接调用方法的形式在绕过,并不推荐;也可以用 Array 套着传, 不过这样需要有文档支持,不然不够清晰,回调方法也需要独立的验证,故也不推荐)。 效率 肯定是delegate比NSNotification高。 KVO提供一种机制,当指定的被观察的对像的属性被修改后

详解Objective-C runtime

≡放荡痞女 提交于 2019-11-27 15:59:38
原文地址: http://blog.securemacprogramming.com/2013/12/by-your-_cmd/ 感谢翻译小组成员 wingpan 热心翻译。本篇文章是我们每周推荐优秀国外的技术类文章的其中一篇。如果您有不错的原创或译文,欢迎提交给我们,更欢迎其他朋友加入我们的翻译小组(联系qq:2408167315)。 本文是我在 Alt Tech Talks: London 上关于 Objective-C runtime的演讲总结,如果你对Objective-C runtime感兴趣的话,应该看看这篇文章,特别是文章中的链接,一定会受益匪浅。 什么是Objective-C runtime? 简单来说,Objective-C runtime是一个实现Objective-C语言的C库。对象可以用C语言中的结构体表示,而方法(methods)可以用C函数实现。事实上,他们 差不多也是这么干了,另外再加上了一些额外的特性。这些结构体和函数被runtime函数封装后,Objective-C程序员可以在程序运行时创建,检 查,修改类,对象和它们的方法。 除了封装,Objective-C runtime库也负责找出方法的最终执行代码。当程序执行[object doSomething]时,不会直接找到方法并调用。相反,一条消息(message)会发送给对象(在这儿

KVO和NSNotification

时间秒杀一切 提交于 2019-11-26 18:29:30
和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。 1)KVO的使用: 被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者 - ( void )addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:( void * )context Parameters anObserver   The object to register for KVO notifications. The observer must implement the key- value observing method observeValueForKeyPath:ofObject:change:context:. keyPath   The key path, relative to the receiver, of the property to observe. This

iOS开发---图解KVO

你说的曾经没有我的故事 提交于 2019-11-26 12:44:54
文章目录 iOS开发---图解KVO 什么是KVO? KVO基本使用 注册观察者 监听回调 调用方式 自动调用 手动调用 移除观察者 Crash 观察者未实现监听方法 未及时移除观察者 多次移除观察者 实际应用 KVO实现原理 测试代码 发现中间对象 NSKVONotifying_Person类内部实现 setter实现不同 KVO内部调用流程 KVO扩展 1.KVC 与 KVO 的不同? 2.和 notification(通知)的区别? Table of Contents iOS开发—图解KVO 什么是KVO? KVO基本使用 注册观察者 监听回调 调用方式 自动调用 手动调用 移除观察者 Crash 观察者未实现监听方法 未及时移除观察者 多次移除观察者 实际应用 KVO实现原理 测试代码 发现中间对象 NSKVONotifying_Person类内部实现 setter实现不同 KVO内部调用流程 KVO扩展 1.KVC 与 KVO 的不同? 2.和 notification(通知)的区别? iOS开发—图解KVO 什么是KVO? KVO 全称 Key Value Observing ,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于 KVO 的实现机制,只针对属性才会发生作用,一般继承自 NSObject 的对象都默认支持 KVO