KVO是iOS Foudation框架提供的一套监听机制,常用于实现视图与数据的绑定。但iOS原生KVO却有很多问题,一般都会对其进行封装,避免直接使用。KVO并不会增加监听者和被监听者的引用计数。
问题1:被监听者多次添加相同的监听者(observer)和监听属性,若遇到属性变化,会多次触发回调。
问题2:某个属性没有添加某个监听者,但是却被某个监听者移除,或者被重复移除,会导致crash。
问题3:需要重写 -observeValueForKeyPath:ofObject:change:context:方法,回调与添加监听分离,若在添加监听处有大量参数需要传入,参数传递麻烦。在回调中需要通过switch或大量if对keyPath判断,代码可读性差。
问题4:需要手动移除监听者,且时机必须合适,若监听者被dealloc,监听关系还存在,当监听值变化时,会给监听者的野指针发送消息,导致野指针crash。
解决方案:
问题1:













网友评论