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

为什么我在使用NSManagedObject的self上得到了一个基于崩溃清除块的KVO?

在使用NSManagedObject的self时,可能会触发一个基于崩溃清除块的KVO(Key-Value Observing)的现象。这是因为NSManagedObject是Core Data框架中的一个关键类,用于管理应用程序的对象图和持久化存储。在Core Data中,NSManagedObject类使用KVO来监视其属性的变化,并在适当的时候更新相关的持久化存储。

当你在使用NSManagedObject的self时,可能会触发KVO的机制。KVO机制会在对象的属性发生变化时发送通知,以便其他观察者可以进行相应的处理。在这种情况下,当你访问NSManagedObject的self时,可能会触发属性的变化,从而导致KVO的通知被发送。

基于崩溃清除块的KVO是一种特殊的KVO机制,它在观察者处理通知时使用了一个崩溃清除块。这个崩溃清除块会在观察者处理通知时发生异常时被调用,以确保观察者的异常不会影响到其他部分的代码执行。

为了解决这个问题,你可以尝试以下几个方法:

  1. 避免在NSManagedObject的self上使用KVO。尽量避免在NSManagedObject的自身上使用KVO,而是使用其属性或关联的对象进行KVO操作。
  2. 在使用KVO时,确保正确处理异常。如果你必须在NSManagedObject的self上使用KVO,确保在观察者处理通知时正确处理异常,以避免崩溃清除块的调用。
  3. 仔细检查代码逻辑和数据模型。确保你的代码逻辑和数据模型正确无误,避免可能导致KVO异常的问题。

总之,当在使用NSManagedObject的self时触发基于崩溃清除块的KVO时,需要仔细检查代码逻辑和数据模型,并确保正确处理异常。

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

相关·内容

OCMock 源码分析

图1.png 这个实现类似于 KVO 实现,不过后面还做了一个逻辑,对于新 meta,为每一个 SEL 创建一个带ocmock_replaced_前缀 SEL,并且让这个带前缀 SEL 指向原始实现...不支持类和类方法 由于 OCMock 本身就是基于系统相关类、消息重定向与转发相关方法做,所以肯定是得避免使用者去 Mock 这些类和方法,所以我们得大致清楚限制,避免编写单测时出现始料未及情况。...我们知道被 KVO 对象类会被重写-class方法,返回实际类一个父类。...单测实践中遇到过类似的问题,下面是总结几点来规避错误: 尽量不显式使用-stopMocking,Mock 对象释放时会触发。...当被测试业务代码异步线程使用了被 Mock 对象/类,使用XCTestExpectation挂起单测线程直到异步逻辑处理完毕,或者使用OCMStub(...)将异步线程调用那个方法拦截掉。

71151

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

通过本文,您将了解到: KVO Crash 主要原因 KVO 防止 Crash 常见方案 KVO 防护实现 测试 KVO 防护效果 文中示例代码: bujige / YSC-Avoid-Crash...KVO 允许一个对象监听另一个对象特定属性改变,并在改变时接收到事件。但是 KVO API 设计,个人觉得不是很合理。被观察者需要做工作太多,日常使用时稍不注意就会导致崩溃。...KVO 日常使用造成崩溃原因通常有以下几个: KVO 添加次数和移除次数不匹配: 移除了未注册观察者,导致崩溃。 重复移除多次,移除次数多于添加次数,导致崩溃。...使用了 YSCKVOProxy 对象, YSCKVOProxy 对象 中使用 {keypath : [observer1, observer2 , ...]...经测试可以发现,成功拦截了这几种因为 KVO 使用不当导致崩溃

4.3K41

iOS KVO实现原理及使用

关于KVO实现,文章已经很多了,这里阐述个人观点,写一些自己感受 1、简介 KVO(key-value observe)是KVC基础上实现一种用于监听属性变化设计模式;如果对某个类某个属性设置了...如果本类一个属性改变会影响到其他多个属性变化,我们也会经常自己重写这个属性set方法,用来监听他变化,但是如果不是本类属性,我们就没办法重写其set方法了,这个时候KVO就可以上场了,其实KVO...2、使用 1)设置监听 // 初始化一个测试类,类里面声明一个属性:nameStr_kvoTest = [[KVOTestModel alloc] init];// 给属性nameStr设置监听,类型不同...,KVO会根据注册时option返回不同字典 上面我们提到了KVO是建立KVC基础上,可以看到,如果不通过KVC改变属性,那么set方法就不会执行,那么KVO也就没办法监听属性变化了。...还试了一下,创建一个名为“NSKVONotifying_对象名”类,发现系统运行到注册 KVO 代码时,iOS10及以下会崩溃,iOS11下控制台打印警告: [general] KVO failed

47820

CoreData 探秘 - 从数据模型构建到托管对象实例

这个关系视图模型编辑器中起到了重要作用,可以直观地显示实体之间关系。由于取消了可视化关系视图,elements 元素中信息基本上失去了作用。...使用 Xcode 生成代码可以省去手动编写工作量,特别是属性较多或模型结构复杂情况下。....primitiveValue(forKey: "timestamp") // not trigger KVO 在上面的示例中,item.timestamp 是通过为实体 Item 声明一个对应 NSManagedObject... NSPersistentStoreCoordinator 实例上添加一个持久化存储。 创建一个主线程托管对象上下文。...通过使用正确 EntityDescription,我们可以创建 NSManagedObject 实例,许多场景下可以达到同样效果。

23720

「死磕」Core Data——入门

(对应App中「对象」) 就理解,Managed Object和上面提到Entity,本质上是同一个东西,就是你数据对象,只不过是可视化操作和纯代码操作中不同称谓。...简单说,假如修改了数据模型(比如修改了. xcdatamodel文件:增加了实体,增加了特性等等),为了防止使用更新App后,由于数据模型不一致导致崩溃,需要进行一定处理,这个处理,他们叫「版本迁移...为什么要用NSManagedObject子类 这时候其实可以进行数据增删查改了。...另外,不能用alloc、init方法创建一个对象,会崩溃。 4、删 删除数据比较简单,直接调用NSManagedObjectContextdeleteObject:方法即可。...版本「迁移」 应用场景:修改了数据结构(比如说某个实体增加了一个特性),这时候就要进行版本迁移了,否则已经安装旧App手机,更新应用后,两边数据结构不一致导致不能识别,会崩溃

1.1K20

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

,内部会生成一个该对象所属类子类,然后从写被观察属性setter方法,当然重写方法中会调用父类setter方法从而不会影响框架使用逻辑,之后会将该对象isa指针指向新创建这个类,最后会重写...,我们使用object_getClass ()方法成功躲开了 KVO 障眼法,发现添加观察过后,_obj类变成了NSKVONotifying_TestObj,移除观察过后,_obj类又变回TestObj...通过这一小代码,就基本可以验证以上原理(当然更详细分析可看Mike Ash大神那篇文章)。 三、代码实现 KVO基于runtime实现代码 通过前面两节分析,相信都会有一点思路了。...,这和苹果 KVO 做法不太一样,如果你做个试验就会知道,苹果实现会将 keypath 所有涉及对象都更换一个动态实现子类,当然,这里这么做一是为了减少复杂判断,也是为了更清晰实现 KVO...,特意写了两个方法来读写它,dealloc中将其指针内存清除

98380

KVO详解(一)

之前文章iOS开发中设计模式--观察者模式中有介绍过KVO简单使用,大家可以先去了解一下。今天呢,我们来详细分析下KVO。...已经被销毁了,因此再使用原来B指针去找对应相应方法,就会导致野指针调用,程序就会崩溃。...然后运行程序,当跑到第一个断点处时候,此时还没有给self.person实例对象添加KVO观察者,使用llvm指令调试如下: ?...如果一个子类复写了父类中某个方法,那么子类和父类methodlist中都有该方法,只不过方法查找过程中先在子类methodlist中找到了该方法,找到之后就不再往上继续查找了而已。...为了测试,暂且不移除,并且dealloc方法最后打个断点,当走到断点处时候,使用llvm指令获取被观测对象isa指向,如下: ?

73431

KVO详解及底层实现

,也是所能想到: 如何动态生成一个类??...知道了原理,能不能自己写一个KVO?? 动态生成一个自己类 既然是动态生成,肯定是利用了苹果runtime机制,通过上面对KVO学习,也了解到了runtime强大之处。...自己动手写一个KVO KVO底层实现还是很复杂,下面只是简单写下实现过程: 因为它是一个非正式协议,给NSObject新建一个Category,NSObject+kvo.h,添加监听方法: .h文件...,将它改为NO,否则会报参数太多错误: 注意二 解释下代码中v@:@意思: 第一个v表示方法返回值void 第二三个@:一般是一,因为函数至少有两个参数self和_cmd,一般是固定写法 最后一个...@表示参数类型,是一个对象 下面代码中实验,看下我们自己写kvo有没有执行: 修改添加监听者方法,改成我们自己 [self.person zj_addObserver:self forKeyPath

2.2K20

储存篇 - CoreData使用大全

四、手动创建CoreData使用 值得注意是:下面的例子中我们可以直接使用创建目的实体类如:Dog,也可以使用NSManagedObject 这一公共实体类,可以使用KVC赋值,也可以使用 ....【四】使用系统自动创建CoreData ? ? 系统帮我们AppDelegate中创建了一个NSPersistentContainer实例,以及一个saveContext方法。...【五】关于CoreData版本迁移 应用场景:修改了实体数据结构(比如说某个实体增加了一个特性),因为APP版本更新后沙盒中NSDocumentDirectory 中缓存数据都不会被清除,这时候就要进行版本迁移了...,否则已经安装旧App手机,更新应用后,两边数据结构不一致导致不能识别,会崩溃。...国外开发者开源了一个基于CoreData封装第三方——MagicalRecord,就像是FMDB封装SQLite一样, MagicalRecord封装CoreData,使得原生CoreData更加容易使用

2.5K20

探究ReactiveCocoa 底层KVO封装流程

,去掉了胶水代码,真正到了面向业务开发,那它是怎么实现呢,接下来我们来一层层分析 作为一个开发者,有一个学习氛围跟一个交流圈子特别重要,这是一个iOS交流群:763164022,不管你是小白还是大牛欢迎入驻...,一个这样代码中做了订阅者sendNext操作,这样信号量生命周期是完整,但是我们KVO操作到现在还没有看见,那么只可能在这步操作隐藏了封装内容 [self rac_observeKeyPath...,我们接下来继续分析这部分代码:通过订阅信号时保存sendNext代码,把监听到change值传出去,也就是我们VC那一个block调用部分, 重点来了: 点击进去我们能够看到一段很长代码,...否则就把改变值传出去,通过三次block代码回传,传到VCsubscribeNext订阅保存代码里,供开发者使用!...类来移交监听,RACKVOTrampoline系统KVO代理中,利用代码把改变值,通过订阅信号时保存block传出去,开发者层面上,我们只能看到逻辑紧凑并且简单易用使用部分。

36620

探究ReactiveCocoa 底层KVO封装流程

订阅信号,外面订阅信号并同时调用了初始化保存这个block代码,代码里进行completed操作取消订阅,取消订阅之前,一个这样代码中做了订阅者sendNext操作,这样信号量生命周期是完整...,我们接下来继续分析这部分代码:通过订阅信号时保存sendNext代码,把监听到change值传出去,也就是我们VC那一个block调用部分, 重点来了: 点击进去我们能够看到一段很长代码,...我们先分析监听上部分这段代码逻辑,上面这段代码还是只做中间层传值,RAC又封装了一个中间层对象RACKVOTrampoline,并且由这个对象实现了KVO监听。...否则就把改变值传出去,通过三次block代码回传,传到VCsubscribeNext订阅保存代码里,供开发者使用!...类来移交监听,RACKVOTrampoline系统KVO代理中,利用代码把改变值,通过订阅信号时保存block传出去,开发者层面上,我们只能看到逻辑紧凑并且简单易用使用部分。

83020

揭秘 SwiftData 数据建模原理

SwiftDataKit:让你在 SwiftData 中使用 Core Data 高级功能[3] 一文中,介绍了如何调用 SwiftData 元素背后对应 Core Data 对象技巧。...总的来说,SwiftData 等框架与 Swift 语言关系密切,并在采用新特性方面起到了引领作用。学习这些框架同时也是掌握 Swift 语言新特性。...(timestamp: Date) { self.timestamp = timestamp } // 一个用来包装对应托管对象( NSManagedObject )...其内部应该使用了如下构建托管对象方式: let item = Item(entity: Item.entity(), insertInto: nil) 这点也解释了,为什么 SwiftData...: Date.distantPast) SwiftData 使用 createBackingData 创建 Item 实例时,首先会创建一个 timestamp 默认值为 Date.now NSManagedObject

35120

AFNetworking框架分析(三)——AFURLSessionManager(下)

上一篇讲到AFHTTPSessionManager中,初始化NSMutableURLRequest对象时流程分析。...接下来继续分析在生成request之后AFN创建task任务流程 NSMutableURLRequest对象初始化之后,创建了一个NSURLSessionDataTask任务类对象,并将request...监听上传、下载progress属性KVO处理方法实现 以上就是AFN请求过程进度更新返回内部实现。 这里为什么要在AFN内部添加delegate,并将其和task进行一一绑定?...此处运用到了GCD中dispatch_group调度组(通常在项目中需要指定多个任务全部完成后再执行其它任务时,使用dispatch_group调度组可以最快捷实现该功能) ?...dispatch_group调度组使用 利用三位运算符,判断如果没有实现自定义completionGroup和completionQueue,那么就使用AFNetworking提供私有的dispatch_group_t

71720

iOS 自我检測

NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject哪些须要在线程中创建或者传递?你是用什么样策略来实现?...14.NSNotification和KVO差别和使用方法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们实现上有什么差别吗?...假设用protocol和delegate(或者delegateArray)来实现类似的功能可能吗?假设可能,会有什么潜在问题?假设不能,为什么?...(尽管protocol和delegate这样东西面试已经面烂了…) 15.blockARC中和传统MRC中行为和使用方法有没有什么差别,须要注意些什么?...如今有没有可用方法绕过这些不足来实现需求。假设能够的话,你有没有考虑或者实践过又一次实现OC一些功能。假设有,详细会怎样做? 18.你实现过一个框架或者库以供别人使用么?

21620

iOS Crash不崩溃

用户使用App过程中,经常遇到闪退情况,体验不太好,本文尝试探索引发闪退原因,以及遇到crash情况下,尽可能保持程序运行,并及时上报错误。...2.2 针对KVO Crash处理机制 新建一个对象,用来记录target,observer,context,keypath等,每添加一个监听,增加一个对象,用一个数组维护。...添加和删除时候做判断,同时hook dealloc函数,dealloc同时移除观察者和我观察对象。...注意:使用方法进行捕获异常之后,第三方工具将不会搜集到崩溃信息并上报,需要在catch中手动上报。...打印出了堆栈信息,同时避免了程序崩溃。 注意:使用方法进行捕获异常之后,第三方工具将不会搜集到崩溃信息并上报,需要在catch中手动上报。

2.1K20

KVO详解(二)

现在想看一下当被KVO观测属性值改变时候,原来setter方法里面做了哪些事情: ? 然后调试框中使用watchpoint来观测_name变化: ?...答案是通过一个数组来保存这些观察者。 那么什么时机进行保存呢? 答案是添加观察者时候就进行保存。 那么保存时候,是保存哪些内容呢?不会是只保存观察者这一项吧?...保存KVO信息模型中,关于观察者observer属性声明使用是weak关键字,各位知道是为什么吗?这是因为如果不使用weak将会导致循环引用。...那我就会想到,既然这样,NSObject+NormanKVO中复写dealloc方法好了: ? 这样做是有问题为什么呢?...KVO使用KVO原理以及KVO自定义,相信到这里诸位对KVO已经有了一个相对比较深入了解了。

68331

RAC(ReactiveCocoa)介绍(八)——KVO销毁

上一篇探究了RAC销毁机制,既然说到销毁,就不得不说下RAC中KVO销毁。 RAC中使用KVO时,仅需一行代码,即可完成对指定对象属性变化值监听,而且不再需要时刻关注KVO销毁。...), keyPath]; } 实现方法中,可以发现使用了map映射方法,当KVO监听属性时,会有多个数据通过元组形式返回,此时只取元组中一个值,即newValue。...为什么要去元组value一个值,这时打印一下value就会发现: ? RAC_KVO属性值打印结果 value中以元组类型存在数据,与KVO本身监听属性值变化时打印值非常相像。...那么value中一个元素,即为RAC KVO方法监听到新属性值。...:(__bridge void *)self]; } 通过层层查看代码实现,最终找到了RAC内部是大体如何实现KVO监听者remove移除操作。

1.5K20

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

3.KVO实现原理 当某一个实例第一次使用KVO时候,系统就会在运行期间动态创建该类一个派生类,该类命名规则一般是以NSKVONotifying为前缀,以原本类名为后缀。...并且将原型对象isa指针指向该派生类。同时派生类中重载了使用KVO属性setter方法,重载setter方法中实现真正通知机制,正如前面我们手动实现KVO一样。...这么做是基于设置属性会调用setter方法,而通过重写就获得了 KVO 需要通知机制。...当对同一个keypath进行两次removeObserver时会导致程序crash,这种情况常常出现在父类有一个kvo,父类dealloc中remove了一次,子类又remove了一次情况下。...不知道你发现没,目前代码中context字段都是nil,那能否利用该字段来标识出到底kvo是superClass注册,还是self注册

1.4K30
领券