首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序员面试闪充 -- KVC&KVO

KVO其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发就会回调监听器自身。...: context:方法,监听的余额发生改变后会回调监听器方法observeValueForKeyPath: ofObject: change: context:。...但由于KVC不会对键和键路径进行错误检查,所以编译器无法检测错误。而且使用KVC后的执行效率要低于合成存取器,因为使用KVC必须先解析字符串,然后再设置或服务对象的实例变量。...将Model层的变化,通知到多个Controller对象,可以使用NSNotification;如果是只需要观察某个对象的某个属性,可以使用KVO。...改变发生后, didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context:也会被调用。

731110

深入详解iOS适配技术

当我们点击周围四条虚线,虚线会变成实线,代表子控件和父控件在这个方向上的间距被固定了。当我们点击子视图内部的虚线,同样也变为实线,代表子视图的宽度或者高度被固定了。...如果UIView设置了autoresizesSubviews,那么他的子控件的bounds如果发生了变化,他的子控件将会根据子控件自己的autoresizingMask属性的值来进行调整。...值得注意的是:autoresizingMask的枚举值是使用位移的形式给出的,这样设置的好处在于,当我们使用代码给某个视图设置autoresizingMask属性,我们可以给autoresizingMask...storyBoard上的autoresizing.gif 注意:Autoresizing只能设置父子视图之间的关系,也就是说,Autoresizing只能控制子视图和父视图之间的位置/大小关系。...AutoLayout自iOS6开始引入,但由于当时XCode4当时AutoLayout的支持不是很好,所以在XCode5/iOS7及其之后,AutoLayout才开始被广泛应用。

8.4K70
您找到你想要的搜索结果了吗?
是的
没有找到

编码篇-KVO的使用大全

KVO是“观察者”设计模式的一种应用,利用它可以很容易实现视图组件和数据模型的分离,数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发就会回调监听器自身。...某个类的属性对象第一次被观察,系统就会在运行期间动态地创建该类的一个派生类,在这个派生类中重写基类的任何被观察属性的setter方法。派生类在被重写的setter方法内实现真正的通知机制。...改变发生后,didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。...由于这种继承方式的注入是在运行时而不是编译实现的,如果给定的实例没有观察者,那么KVO不会有任何开销,因为此时根本就没有KVO代码存在。...类的A属性进行观察,B、C属性发生改变,也会触发A的观察者方法。

59220

WWDC2016 Session笔记 - Xcode 8 Auto Layout新特性

生成对应的constraints是发生在运行时,不是编译的原因是可以给我们开发者更加便利的方式为View添加更加细致的约束。...这个时候我们更新一下中间温度的Label的字体大小,这时候计算变大,由于我们的constraints都是正确的,两边的View也会随着Label字体变大变大。...这件事很容易,只要我们调整一下cell的位置信息即可完成。排列的位置信息会影响到cell,行,列,网格视图。...其中一个view调用完setNeedsLayout之后,会传递到父视图继续调用setNeedsLayout,父视图的setNeedsLayout可能又会调用到其他视图的layout信息。...目前可以想到会产生环的场景是这样子的:在上面的3颗子树,某种场景下,突然删掉了右边的子树,假设用户的屏幕现在是全屏,由于一下子突然删掉了一堆view,那么原来那里就会变成空白,这个时候开发者想要把其他的

68230

KVO 正确使用姿势进阶及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里

首先,讲解一下为什么要在对象被销毁前删除监听器,我们在开发中使用KVO很可能会遇到因为没有删除监听器产生的野指针错误。...KVO在注册监听器的时候不会持有监听器对象的引用,也不会像weak那样在监听器对象被销毁置nil,而是仅仅保留监听器对象的地址,类似于copy修饰符,监听器对象被销毁而又没有删除监听器,如果这个时候被监听对象的值发生变化系统会执行监听器的回调函数...此时如果点击第二个按钮BTN2不幸的事情就会产生,在button2Clicked方法中会产生野指针错误,因为在该方法中修改了model.balance的值,由于前一个视图中没有删除监听器,KVO中仍然有监听器的存在...上面这个栗子产生的野指针错误正是因为KVO使用不正确,可能有些读者没有在监听器销毁前删除监听器也没有发生过任何异常,因此不太注意,但KVO正确使用姿势一定是在监听器对象销毁前删除监听器。...一个对象的属性第一次进行监听器注册后,编译器会默认生成一个名称为NSKVONotifying_原有类名称的派生中间类,该类继承原有类,然后修改原有类对象的isa指针,使其指向新生成的中间类,接着,会在派生类中修改监听属性的

1.5K80

程序员面试这样介绍自己的项目经验,成功率能达到98.99%

基本原理: 1.KVO是基于runtime机制实现的 2.某个类的属性对象第一次被观察,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。...改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。...观察对象AKVO机制动态创建一个新的名为: NSKVONotifying_A的新类,该类继承自对象A的本类,且KVO为NSKVONotifying_A重写观察属性的setter 方法,setter...2个方法: 被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该 keyPath 的属性值即将变更;改变发生后, didChangeValueForKey: 被调用,...由于http的应用场景都是由客户端发起,服务器响应,所以这种由客户端单方生成密钥的方式可以一定程度上便捷的保证通信安全。

95810

View编程指南(三)

autoresizingMask, autoresizesSubviews 这些属性会影响view及其子view的自动调整大小行为。...如果此属性设置为YES,则该view使用每个子view的autoresizingMask属性来确定如何调整和定位该子view。任何子view的大小更改会触发嵌入式子view的类似布局调整。...打电话,状态栏高度会增加,当用户结束通话,状态栏的大小会减小。 在运行时修改view 随着应用程序从用户接收输入,他们调整其用户界面以响应该输入。...这些views不再需要,就把它们处理掉。 设备改变方向,view controller可能会调整view的大小和位置以匹配。...触摸事件发生,window将相应的事件对象分派到发生触摸的view。如果你的view一个事件不感兴趣,它可以忽略它,或者把它传递给响应者链,由另一个对象处理。

1.7K30

号外!!!MySQL 8.0.24 发布

和 keyring_encrypted_file插件相似 ,但配置不同,使用不同的磁盘存储格式,并且密钥类型和密钥大小的限制较少。...该 AUTOEXTEND_SIZE选项在MySQL 8.0.23中引入,它定义了InnoDB 表空间变满扩展表空间大小的数量。...(缺陷#102101,错误#32335256) 在解释旧式的访问路径计划LATERAL,由于所有外部联接均会延迟到所有外部联接完成之前,其缓存无效化器才被延迟,因为外部联接可能会产生空补充行,这也会使高速缓存无效...外部联接包含LATERAL,并且LATERAL 仅引用同一外部联接中的表,就会出现问题 。在这种情况下,应该立即应用无效器,不要延迟,以免我们遗漏发出的行,并且错误地保留了缓存。...特别是,某些Information Schema表位于外部联接的右侧,可能会发生这种情况,因为这些表现在是使用定义的视图LATERAL。

3.6K20

深度解读 Observation —— SwiftUI 性能提升的新途径

它的出现有望缓解开发者长期面临的 SwiftUI 视图无效更新问题。本文将采取问答的方式,全面详尽地探讨 Observation 框架,内容涉及其产生原因、使用方法、工作原理以及注意事项等。...减少 SwiftUI 中对视图无效更新,提高应用性能。...,可以减少大量无效视图更新。...另外, 我们之前在视图中很多的优化技巧也将发生改变。例如,在使用 ObservableObject ,我们会通过只引入与当前视图有用的数据,来减少不必要的刷新。...经过修改后, store.b 发生变化时,只有 B 视图会重新评估。 由于 Observation 框架仍然是一个新事物,其 API 也还在不断演化中。

49520

iOS APP运行时Crash自动修复系统

由上可见多数由于KVO导致的crash原因是由于被观察对象的KVO关系图混乱导致。那么如何来管理混乱的KVO关系呢。...避免出现KVO的被观察者dealloc仍然注册着KVO产生的crash 3.3 NSNotification类型crash防护(NSNotification) 3.3.1 NSNotification...由上图流程可知,NSTimer的回调函数fireProxyTimer:被执行的时候,会自动判断原target是否已经被释放,如果释放了,意味着NSTimer已经无效,此时如果还继续调用原有target...一些常见的越界,插入nil,等错误操作均会导致此类crash发生由于产生的原因比较简单,就不展开来描述了。...实例的全部方法拦截机制 和 消息转发机制,那么就可以做到在野指针访问不Crash只是crash相关的信息。

3.2K1713

OC观察者模式之KVO的使用与思考

KVO俗称键值观察(key-value observe),键值观察是被观察的对象属性发生改变,会通知到观察对象的一种机制。...KVO俗称键值观察(key-value observe),键值观察是被观察的对象属性发生改变,会通知到观察对象的一种机制。...1.KVO的作用 1、监听带有状态的基础控件,如开关、按钮等; 2、监听字符串的改变,监听的字符串改变,来做一些自定义的操作; 3、数据模型的数据发生改变视图组件能动态的更新,及时显示数据模型更新后的数据...但是与delegate不同的是:这两个都是负责发送接收通知,剩下的事情由系统处理,所以不用返回值;delegate 则需要通信的对象通过变量(代理)联系;delegate只是一一,而这两个可以一多...3、被观察者销毁还存在观察者(iOS11以上不会崩溃) 这种情况常出现在复杂逻辑下,观察者先于被观察者销毁[9] 4、KVO 行为是同步的,并且发生与所观察的值发生变化的同样的线程上。

1.4K30

KVO实现原理

监听的属性路径为keyPath支持点语法的嵌套 监听类型为options支持按位或来监听多个事件类型 监听上下文context主要用于在多个监听器对象监听相同keyPath进行区分 添加监听器只会保留监听器对象的地址...age = arc4random()%100; } - (void)dealloc { [self.p1 removeObserver:self forKeyPath:@"age"]; } // 监听对象的属性值发生改变...1、利用RuntimeAPI动态生成一个子类NSKVONotifying_XXX,并且让instance对象的isa指向这个全新的子类NSKVONotifying_XXX 2、修改对象的属性,会在子类...改变发生后, didChangeValueForKey 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。...set方法 4、不移除KVO监听,会发生什么 不移除会造成内存泄漏 但是多次重复移除会崩溃。

1.1K00

Mac开发之 Cocoa 绑定 入门

-视图-控制器完全没有必要,特别是控制器仅仅是在模型与视图之间传递信息(比如一个UILabel需要显示文本来自数据模型的内容),为了解决这种情况,苹果公司在OSX中引入了Cocoa绑定....3.绑定简单使用方式 3.1 视图(View)绑定到模型(Model) 将视图绑定到模型对象,就是告诉视图需要显示的内容来自哪里(通常是数据模型对象的某个属性),以及什么时候更新显示内容.数据模型的某一属性的值发生改变...可以将视图的许多不同属性绑定到某一(或多个)模型的属性上.能够绑定的具体视图属性会因视图不同不同....添加代码 son的score值发生变化时,Label和Slider会同时更新它们的显示.我们没有在视图和数据直接添加任何数据传递的代码,就完成了它们之间的相互联系,由此可见,cocoa绑定为我们节省了代码量...: 添加UI控件 (2)设置复选框的绑定,复选框的Valus属性进行绑定操作 绑定复选框的Value到默认系统 (3)设置slider的绑定(设置slider控件的enable属性绑定),大体如下图:

1.8K20

iOS面试题梳理(二)

KeyPath、KVC、KVO路径(KeyPath): 1.在一个给定的实体中,同一个属性的所有值具有相同的数据类型。 2.键-值编码技术用于进行这样的查找,它是一种间接访问对象属性的机制。...KVC机制通过key找到value的原理 1.通过KVC调用对象,比如:[self valueForKey:@”someKey”],程序会自动试图通过下面几种不同的方式解析这个调用; 2.首先查找对象是否带有...4.设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值,对象能够在错误发生前,有最后的机会响应这个请求。...NSNotification、Block、Delegate和KVO的区别 1.代理是一种回调机制,且是一一的关系,通知是一多的关系,一个向所有的观察者提供变更通知; 2.效率:Delegate比NSNOtification...3.提供NSFetchResultsController类用于管理表视图的数据,即将Core Data的持久化存储在表视图中,并这些数据进行管理:增删查改。

1.2K101

KVO编程指南

另外,model对象可能会观察到其他model对象(通常用于确定依赖值何时发生变化),甚至是自身(再次确定依赖值何时发生变化)。 您可以观察属性,包括简单属性,一一关系和多多关系。...你可以使用prechange通知观察者自己的KVO要求它调用其中一个属性的-willChange ...方法之一,普通的通知会晚点以致于无法及时调用willChange。...如果您对所有观察到的键路径使用单个context,则首先根据通知的context其进行测试,并找到匹配项,然后使用键路径字符串比较来确定具体发生了什么变化。...在任何情况下,观察者都应该总是调用父类的observeValueForKeyPath:ofObject:change:context的实现:它不能识别上下文(或者简单情况下,任何关键路径),因为这意味着父类已经注册了...一个观察者注册一个对象的属性,被观察对象的isa指针被修改,指向一个中间类不是真实类。 因此,isa指针的值不一定反映实例的实际类。 你不应该依靠isa指针来确定类成员关系。

84920

iOS实例——滑动列表展现隐藏顶部视图

引 项目中需要一个效果:下滚列表顶部的自定义视图不移动,上移时隐藏顶部视图,提高列表的展现范围。...在此基础上海加了一个隐藏列表的动态渐入渐出效果,如下: 实现 实现的要点是,顶部的视图要随着列表的滚动滚动,且列表最上是可以滚动到屏幕顶部的,最下就是滚动到一个固定的位置就不再往下滚动了,至于渐变效果只要能控制滚动自然也能控制随着滚动去改变...视图的内容可以自己定义,我就只放了一张图片。 对于滚动的跟随,我们采用KVO键值观察(可以查看这篇博客来了解)来做。...在处理方法中我们要做两件事,第一件事是让顶部视图的高度随着列表移动移动,但是要控制列表最高移动到的位置TOP和最低移动到的位置BOTTOM,这其实就是顶部视图的低端对应的Y值。...第二件事是让顶部视图随着移动渐变,移动到最高彻底透明,移动到最低不透明,这个alpha值也是根据移动的值来计算的: - (void)updateSubViewsWithScrollOffset:

1.8K10

ios KVO及实现原理

由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVOKVO和NSNotificationCenter都是iOS中观察者模式的一种实现。...区别在于,相对于被观察者和观察者之间的关系,KVO是一一的,不一多的。KVO被监听对象无侵入性,不需要修改其内部代码即可实现监听。 KVO可以监听单个属性的变化,也可以监听集合对象的变化。...通过KVC的mutableArrayValueForKey:等方法获得代理对象,当代理对象的内部对象发生改变,会回调KVO监听的方法。集合对象包含NSArray和NSSet。...NSDictionary *)change context:(void *)context { NSLog(@"%@",change); } 3.观察者不需要监听...:,在存取数值的前后分别调用2个方法: 被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该 keyPath 的属性值即将变更;改变发生后, didChangeValueForKey

64820

Protocol与Delegate 使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里

实现协议还有一种方法,就是通过类别category实现,前面两篇文章讲解的KVC和KVO的实现都是依赖于类别不是接口,类别提供了一种限定性更弱,并且不需要修改源代码的方式来为已有类添加新的方法,非常适用于扩展第三方或是系统提供的已有类...,类似于泛型的语法,在定义协议,支持required关键字标识遵守协议的类必须要实现的方法,optional关键字标识遵守协议的类可选实现的方法。...接下来就叫介绍代理模式也称为委托模式delegate,代理模式顾名思义就是让其他类代理当前类来执行一些任务,实现方式就是要依托协议protocol,定义一系列的方法,如果某个对象想成为其的代理则需要去实现该协议的方法,需要给委托的对象传递信息或是想要从委托对象获取信息就可以调用相关的方法...,通过从委托获取数据这样的方式可以将数据与业务逻辑解耦,就像我们常使用的UITableView或UICollectionView,这些视图是用来展示一系列数据的,这些视图应该只负责展示数据,不应该去负责获取或是决定哪些数据用于展示...委托有两种方式,一种是代理delegate,对象有某些事件发生后需要交由委托对象处理,类似于上面的栗子,这种方式一般代理协议定义的方法会包含一一些必要的参数用于对象通知委托对象,返回值往往为void。

99890

iOS两年前的面试题总结,现在的你掌握了嘛?

事实上,由于静态类型的固定性和可预知性,从而使用的更加广泛。静态类型是强类型,动态类型属于弱类型,运行时决定接受者。...键路径(keyPath)、键值编码(KVC)、键值观察(KVO) 键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型。...比如说,外部传一个模型过来,那么我会直接重写Setter方法,模型传过来时,也就是意味着数据发生了变化,那么视图也需要更新显示,则在赋值新模型的同时也去刷新UI。...GET提交的数据会在地址栏显示出来,POST提交,地址栏不会改变。 传输数据的大小: GET提交,传输数据就会受到URL长度限制,POST由于不是通过URL传值,理论上书不受限。...iOS中的响应者链的工作原理 每一个应用有一个响应者链,我们的视图结构是一个N叉树(一个视图可以有多个子视图,一个子视图同一刻只有一个父视图),每一个继承UIResponder的对象都可以在这个N叉树中扮演一个节点

1.1K20
领券