KVO-对象属性值改变监听

key value observer 键值观察

一、使用方法:

以person对象为例,person中的属性name,监听name值改变的方法

//添加监听的属性keyPath  options:要监听的是新值还是旧值

[self.person
addObserver:self
forKeyPath:@"name"
options:NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld
context:nil];

//监听方法的实现

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary
*)change context:(void *)context {

//keyPath:被监听的属性名

//ofObject:被监听的对象

//change:被监听属性的值包括新值和旧值

}

二、注意事项

1、KVO 是同步执行的,一旦对象的属性值发生变化,KVO的方法就会被调用,并且是在值改变线程中被调用,

在多个线程中同时修改一个观察者属性的时候,KVO监听方法中会存在资源抢夺的问题,改善方法是使用互斥锁

KVO中一般不涉及复杂的逻辑处理,只是做简单的观察

2、通知也可以认为是KVO,使用方法很类似,通知在对象销毁的时候需要删除通知,同样KVO在对象销毁的时候也需要删除观察者

- (void)dealloc {

[self.person
removeObserver:self
forKeyPath:@"name"];

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 16:19:16

KVO-对象属性值改变监听的相关文章

C#利用反射获取对象属性值

public static string GetObjectPropertyValue<T>(T t, string propertyname){     Type type = typeof(T); PropertyInfo property = type.GetProperty(propertyname); if (property == null) return string.Empty; object o = property.GetValue(t, null); if (o == n

Android之怎样设置文本改变监听

文本改变监听: username为EditText的一个对象 username.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //參数依次代表的意思:s文本内容,start从第几个字符開始改变,before(自己能够測试一下.我没測试),count改变的字符个数 // TODO Au

Android之如何设置文本改变监听

文本改变监听: username为EditText的一个对象 username.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //参数依次代表的意思:s文本内容,start从第几个字符开始改变,before(自己可以测试一下,我没测试),count改变的字符个数 // TODO Au

C#通过属性名字符串获取、设置对象属性值

目录 #通过反射获取对象属性值并设置属性值 #获取对象的所有属性名称及类型 #判断对象是否包含某个属性 #通过反射获取对象属性值并设置属性值 0.定义一个类 public class User { public int Id { get; set; } public string Name { get; set; } public string Age { get; set; } } 1.通过属性名(字符串)获取对象属性值 User u = new User(); u.Name = "lily&

asterisk-java ami3 属性改变监听

asteriskServer.addAsteriskServerListener(new AsteriskListenerInit());//服务属性监听会自动连接服务 实现AsteriskServerListener,PropertyChangeListener,对服务的通道,用户,队列,语音室所有属性改变 public class AsteriskListenerInit implements AsteriskServerListener,PropertyChangeListener{ @O

微信小程序全局变量改变监听

问题来源 最近工作需要写小程序页面,其中有个页面情况为:父页面中包含了一个组件页面,组件页面中又包含了另外一个组件页面.需求为:点击最后一个组件页面中的一个view,需要显示最外层父页面中的一个弹出层,并且动态的展示值,这个值的来源就是最后一个组件页面中的内容. 处理办法 当时想到的就是使用全局变量,在 app.js 中定义好全局变量,点击组件页面时就修改全局变量的值,父页面同样使用全局变量的值,这样一来就可以动态打开/关闭弹出层且传递值了. 下面先看看 app.js 中怎么定义的: globa

关于Javascript中通过实例对象修改原型对象属性值的问题

Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的说就1种,即Object类型.往细的说有:Object类型.Array类型.Date类型.Regexp类型.Function类型等. 当原型对象的属性值为基本类型的数据值时,通过实例对象修改属性值从而引起原型对象的属性值发生变化的情况不会发生.当原型对象的属性值为引用类型的数据值时,通过实例对象修改

ListView的View回收引起的checkbox状态改变监听等问题解决方案

我的ListView中每行View包含一个ImageView.TextView.CheckBox.当ListView中有一个或一个一行CheckBox被选中就让ListView上面的Button显示,否则就隐藏.因此,需要对每行View中的CheckBox设置监听.我使用CheckBox中的OnCheckedChangeListener监听器,当CheckBox的状态发生改变的时候就会触发这个监听器.先看下我自定义给ListView的Adapter的getView方法中的一些关键代码: 这是ge

Redis集群环境下的键值空间监听事件实现方案

一直想记录工作中遇到的问题和解决的方法,奈何没有找到一方乐土,最近经常反思,是否需要记录平时的点滴,后台还是决定下定决心记录一些,以便以后用到的时候找不着,实现这样的一个功能主要也是业务所需要的. 需求:要求统计所有会员在线人数,并根据会员在线状态同步改变人数. 之前用户登录使用session去控制,那么可以通过session进行在线用户人数统计,后来实现无状态不在依赖session作为用户在线的标准,使用Redis替换了Session,那么用户直接退出也好做,但是会存在用户直接关闭页面的情况,