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

我应该何时从正在观察持久模型类的结束ViewController类中调用removeObserver:forKeyPath?

在观察持久模型类的结束ViewController类中调用removeObserver:forKeyPath的时机应该是在以下情况下:

  1. 当结束ViewController类即将被销毁时,应该调用removeObserver:forKeyPath来移除对持久模型类的观察。这可以在结束ViewController的生命周期方法中实现,例如viewWillDisappear或dealloc方法。
  2. 当持久模型类不再需要被观察时,也应该调用removeObserver:forKeyPath来移除观察。这可能是因为持久模型类已经完成了其任务,或者观察者不再需要接收到该模型类的变化通知。

调用removeObserver:forKeyPath的目的是为了避免潜在的内存泄漏和观察者方法的无效调用。如果不及时移除观察,持久模型类的变化通知仍然会发送到已经销毁或不再需要的观察者对象,这可能导致不必要的资源消耗和潜在的错误。

在腾讯云的产品中,可以使用腾讯云移动推送(TPNS)来实现移动设备的消息推送功能。TPNS提供了全面的消息推送解决方案,包括消息推送、标签管理、用户管理等功能。您可以在结束ViewController类中调用removeObserver:forKeyPath来移除对TPNS的观察,以确保在不需要消息推送时不再接收到相关通知。

更多关于腾讯云移动推送的信息,请访问腾讯云官方网站:https://cloud.tencent.com/product/tpns

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS 开发:『Crash 防护系统』(二)KVO 防护

KVO 允许一个对象监听另一个对象特定属性改变,并在改变时接收到事件。但是 KVO API 设计,个人觉得不是很合理。被观察者需要做工作太多,日常使用时稍不注意就会导致崩溃。...BayMax 系统还利用 Method Swizzling 实现了自定义 dealloc,在系统 dealloc 调用之前,将多余观察者移除掉。...XXShield 在 dealloc 也做了类似将多余观察者移除掉操作,是通过关系数据结构和 _observed ,然后调用原生移除观察者操作实现。...添加时候,如果关系哈希表与 keyPath 对应已经有了相关观察者,就不再进行添加。...在分类自定义了 dealloc 实现,移除了多余观察者。

4.3K41

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

,也就是所有注册了监听器都会执行回调函数,但由于继承关系存在没有执行父回调函数而是执行了两次子类回调函数,因此,为了使得父也能够正确执行监听器回调函数,在子类回调函数应当手动调用,所示子类监听器回调函数正确写法应是如下代码...如果有继承关系,在监听器回调函数中将不是当前处理context调用监听器回调函数进行处理。 删除监听器时需要注意不要重复删除,尽量使用context删除。...关于isa指针、isa-swizzling本博客都有详细介绍,有兴趣读者可以自行查阅: iOS runtime探究(一): runtime开始理解面向对象到面向过程结构体 KVO实现使用了isa-swizzling...技术以及观察者模式。...因此,对于使用KVO监听来说,isa指针指向并不一定指向对象实际。你不应该依赖isa指针取决定成员关系,而应该使用class方法去正确获取对象实际

1.6K80
  • KVO编程指南

    使用方法removeObserverforKeyPath注销观察者:不再应该接收消息时。 至少在观察内存释放之前调用这个方法。 重要提示:并非所有的都符合KVO标准。...在任何情况下,观察者都应该总是调用observeValueForKeyPath:ofObject:change:context实现:当它不能识别上下文时(或者简单情况下,任何关键路径),因为这意味着父已经注册了...您可以调用removeObserverforKeyPath:context:恰好相应调用一次addObserver:forKeyPath:options:context :,或者如果在您应用不可行...,则将try / catch块removeObserverforKeyPath:context:call以处理潜在例外。...你不应该依靠isa指针来确定成员关系。 相反,您应该使用方法来确定对象实例

    87720

    轻量级KVO

    在这篇文章,我会实现一个自己用简单KVO认为KVO非常棒,然而对于我大部分使用场景来说,有这两个问题: 不喜欢在observeValueForKeyPath:ofObject:change...这意味着一旦Observer对象被retain,我们就有了一个观察者,下面这段代码是一个ViewCOntroller拿来: self.usernameObserver = [Observer...来保证被retain,一旦我们Viewcontroller被释放,就会设置它为nil,observer就停止观察了。...在这个实现,使用一个weak引用指向被观察对象和观察者(target)是很重要,如果两个中其中一个是nil,我们就停止向观察者发送消息。...还有很多可以扩展地方,比如增加block支持,或者比较喜欢trick:再增加爱一个方便构造方法用来第一次直接调用action。

    49530

    KVO实现原理

    KVO(key value observing)键值监听是我们在开发中常使用用于监听特定对象属性值变化方法,常用于监听数据模型变化 KVO是为了监听一个对象某个属性值是否发生变化。...,不会增加引用,也不会在对象释放后置空,因此需要自己持有监听对象强引用,该参数也会在回调函数回传 */ - (void)addObserver:(NSObject *)observer forKeyPath.../ - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *...KVO底层交换了 NSKVONotifying_Person class 方法,让其返回 Person 2、重写setter方法:在新中会重写对应set方法,是为了在set方法增加另外两个方法调用...在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧值。

    1.1K00

    iOS KVC和KVO

    @属性发生了改变%@",object,keyPath,change); } - (void)dealloc{ ///> 使用结束后记得移除 [self.person1 removeObserver...那么问题来了,同样走是DLPersonsetAge方法,为什么person1就会走到,方法而person2就不会呢?...当我们DLperson实例对象调用setAge方法时, 实例对象isa指针找到对象,然后在对象寻找相应对象方法,如果有则调用, 如果没有则去superclass指向对象寻找相应对象方法...@属性发生了改变%@",object,keyPath,change); } - (void)dealloc{ ///> 使用结束后记得移除 [self.person1 removeObserver...@属性发生了改变%@",object,keyPath,change); } - (void)dealloc{ ///> 使用结束后记得移除 [self.person1 removeObserver

    85230

    KVC 和 KVO

    KVC Key Value Coding KVC是一种用间接方式访问属性机制。比如你要给一个属性赋值或者取值,可以直接通过和点运算符实现,当然也可以使用KVC。...:forUndefinedKey:和valueForUndefinedKey:方法 KVO Key Value Observing 介绍 KVO其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型分离..._7, 5_0); - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath; @end 拓展名称就可以看出...使用结束removeObserver,这很重要。 实现 最后对上面代码做一些改动,需要对Account对象balance做监听,当balance内容改变,要做输出处理。...开发人员不需要添加任何代码,不需要设计自己观察模型,直接可以在工程里使用。其次,KVO架构非常强大,可以很容易支持多个观察观察同一个属性,以及相关值。

    69110

    iOS - 关于 KVO 一些总结

    调用方法addObserver:forKeyPath:options:context:给被观察对象添加观察者; 在观察实现observeValueForKeyPath:ofObject:change...:context:方法以接收属性改变通知消息; 当观察者不需要再监听时,调用removeObserver:forKeyPath:方法将观察者移除。...问题:   ① 当 balance 发生改变时,应该由谁来处理呢?   ② 如果都由 person 来处理,那么在 Person 监听方法又该怎么判断是自己事务还是子类对象事务呢?   ...4.3 其它注意点 如果对象被注册成为观察者,则该对象必须能响应监听方法,即该对象所属必须实现监听方法。当被观察对象属性发生改变时就会调用监听方法。如果没有实现就会导致Crash。...在观察监听方法应该为无法识别的context或者object、keyPath调用实现[super observeValueForKeyPath:keyPath ofObject:object

    2.6K21

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

    如果是动态读取属性,则优先调用agetter方法,如果没有搜索到则会优先搜索成员变量_a,如果仍然不存在则会搜索成员变量a,如果仍然没搜索到就会调用这个valueforUndefinedKey:方法...KVO其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型分离,当数据模型属性值改变之后作为监听器视图组件就会被激发,激发时就会回调监听器自身。...在OC中使用KVO操作常用方法如下: 注册指定Key路径监听器:addObserver:forKeyPath:options:context 删除指定Key路径监听器:removeObserver...什么时候应该使用通知,什么时候应该使用KVO,它们实现上有什么区别吗?...在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧值。

    751110

    KVO详解(二)

    而且通过查看堆栈信息我们也可以看到,最终还会调到LVPersonsetName,这说明在中间子类setter中会调用setter。 基于上面的分析,就写出了下面的?...(2)复写当前监测属性setter方法,在复写setter做两件事情:①将setter消息转发到父调用setter;②通过遍历对照keypath,找到当前变化所有监听者,并给这些监听者发送一个监听到变化消息...在OC,函数式编程可以通过Block来体现,因此,我们可以通过Block形式将KVO添加观察者和响应变化合二为一。 响应变化Block定义放在KVO信息模型: ?...在本例,被观察对象是person,观察者是viewController,很显然,person是vc属性,所以观察者又持有了被观察对象,这就导致循环引用了。...为了避免循环引用,那么就打断其中一条腿,所以在保存KVO信息模型,关于观察者observer属性声明使用是weak关键字。

    71331

    OC底层探索20-KVOisa-swizzling分析OC底层探索20-KVOisa-swizzling分析

    触发断点之后发现: 调用了set方法NSKeyValueWillChange; 调用了LGPerson原生set方法; 调用了set方法NSKeyValueDidChange方法 最后由NSKeyValueDidChange...即使LGPersonisa已经不指向派生,可派生还是完整存在内存....总结 在addObserver之后: 系统动态创建了中间派生NSKVONotifying_xxx 1.1 在派生重写了set,delloc方法,并创建新方法class,_isKVOA; 将被观察...(LGPerson)isa指向新建中间派生NSKVONotifying_xxx; 在被观察者发生变化: 调用了set方法NSKeyValueWillChange; 调用了LGPerson原生...set方法; 调用了set方法NSKeyValueDidChange方法; 最后由NSKeyValueDidChange调起了回调方法将改变信息送出; 在被观察者销毁时: 将被观察isa重新指向

    61920

    KVO简单使用及其实现原理

    前言 在应用开发,我们经常需要使用到,观察者模式,能监听某些对象属性变化,进行相应操作。在iOS,OC为我们提供了一套更加简洁优雅观察方式——KVO。...要监听属性 - options 选项(方便在监听方法拿到属性值) */ [person addObserver:person forKeyPath:@"name" options...在KVO_PersonsetName和getName方法实现,添加observeValueForKeyPath方法调用。...此时,我们如果调用KVO_PersonsetName和getName,则会调用observeValueForKeyPath。 但是,在KVO使用,我们对KVO_Person是完全不知情。...所以,我们知道,当我们替换掉isa时,其实就是替换掉了消息处理。在上面的例子,当我们调用addObserver时,其实就是将Personisa替换为KVO_Person。

    1.3K30

    透彻理解 KVO 观察者模式(附基于runtime实现代码)

    context:(__bridge void *)(self)]; 方法调用者(就是这个_obj)就是被观察对象。...移除观察 [_obj removeObserver:self forKeyPath:@"aName"]; 移除观察很简单,和移除通知比较类似,我们需要在不用继续观察时候移除它,比如在控制器dealloc...,内部会生成一个该对象所属子类,然后写被观察属性setter方法,当然在重写方法中会调用setter方法从而不会影响框架使用者逻辑,之后会将该对象isa指针指向新创建这个,最后会重写...,发现添加观察过后,_obj变成了NSKVONotifying_TestObj,在移除观察过后,_obj又变回TestObj。...在调用方法之前,使用KVC方式就可以拿到old值,在调用方法之后该值就会改变。

    1K80

    iOS键值观察KVO实例详解简介实例效果实现方式进阶用法

    现在我们给这个实例化了学生模型添加一个观察者,定义为观察学生模型分数变化情况,这时,如果这个学生模型分数发生了变化,比如在按钮响应只对模型分数属性进行修改,KVO这个机制就会自动给观察者发送通知...移除通知 移除通知方法很简单,如下: [self.studentModel removeObserver:self forKeyPath:@"score"]; 观察者那边移除对被观察者特定键观察。...= 1:说明被观察数据setter方法被调用了; NSKeyValueChangeInsertion = 2:当观察数据是集合时,且对它进行insert操作时会返回该值; NSKeyValueChangeRemoval...默认实现模式为自动通知模式,要自定义何时进行通知,就要改成手动通知模式。...,判断当观察key是score分数时,就将自动通知关闭,其余情况还是根据父来进行判断,这样写比较保险。

    36130

    MJRefresh源码剖析与学习

    ,这是一款十分优雅刷新组件库,这开源组件无论代码风格,可用性,易读性还是兼容性来讲都十分优秀。...= 1, /** 松开就可以进行刷新状态 */ MJRefreshStatePulling, /** 正在刷新状态 */ MJRefreshStateRefreshing...:self forKeyPath:MJRefreshKeyPathContentOffset]; [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentSize...,等基state赋值给oldState,再跟新状态对比,对比完后,再[super setState:state]调用,从而赋值基state 该方法主要要注意状态在普通闲置状态以及刷新状态...,把上面跳转方法[vc setValue:@"example01" forKeyPath:@"method"];赋值example01 利用runtime关联,这样分类method属性值就为example01

    1.6K51

    详解:RxSwift-KVO底层探索(上)

    KVO简介 首先我们KVO三部曲开始 // 1: 添加观察 person.addObserver(self, forKeyPath: "name", options: .new, context:.../ 3: 移除观察 person.removeObserver(self, forKeyPath: "name") 其实我们也知道,就是平时在开发时候,我们也可以通过计算型属性也可以直接观察 var...当然可能中间也忽略过一些细节,源码直接贴出来方便自己理解 添加观察 person.addObserver(self, forKeyPath: "name", options: .new, context..." * 添加了`class、set、dealloc`方法 * 原`isa`与动态`isa`切换由原来观察者进行迁移到 GSKVOInfo - (void) addObserver: (NSObject...: o->context]; 完美看到响应回调,舒服 移除观察者 移除观察流程相对来说,比较简单了,但是优秀还是愿意和大家一起探索 - (void) removeObserver: (NSObject

    77620

    浅谈 KVO 实现原理

    观察者不需要监听时,可以调用 removeObserver:forKeyPath: 方法将 KVO 移除。...需要注意是,调用 removeObserver 需要在观察者消失之前,否则会导致 Crash。...这个继承自该对象原本,并重写了被观察属性 setter 方法。重写 setter 方法会在调用原 setter 方法之前和之后,通知所有观察对象值更改。...KVO 缺陷 使用 KVO 时,既需要进行注册成为某个对象属性观察者,还要在合适时间点将自己移除,在观察实现 observeValueForKeyPath:ofObject:change:context...判断当前是否是KVO子类,如果不是则创建,并设置其isa指针。 3. 如果没有实现,则添加Key对应setter方法。 4. 将调用对象添加到数组

    1.9K30
    领券