ios - 未释放的 KVO 发生奇怪的崩溃

标签 ios objective-c key-value-observing

这个问题已经困扰我一段时间了。

我有一个 NSOperation 子类在操作队列中运行。我偶尔遇到过,不常见的(但我们崩溃的重要部分)实例,看起来像键值观察器崩溃。

崩溃看起来像

Crashed: Thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x300000001099d05d
NSKeyValueDidChangeWithPerThreadPendingNotifications.llvm.93060043671412

[OperationClass markAsFinished]

...这强烈暗示了一个未注销的 KVO 对象。问题是我找不到任何对添加到该对象的 KVO 的引用。我什至采用了对象调配的技巧来跟踪对 addObserver:forKeyPath:options:context: 的调用,并且这些类没有注册。

我唯一能想到的是在我的源上下文之外隐式注册 KVO,但我不知道会做什么。

有人有什么想法吗?

最佳答案

您没有提供任何代码,所以我只能泛泛而谈,但是如果您查看 NSOperation 的文档和 NSOperationQueue ,您将看到它们使用 KVC 和 KVO 来监视依赖项、优先级和执行状态。根据错误语句,我想说代码试图发送 KVO 正在监视的“操作已完成”通知,这就是事情崩溃的地方。也许在通知通过之前,某个操作已从队列中拉出并释放?也许队列在其操作之一完成之前正在取消分配?也许某个操作在其依赖项之一完成之前就已解除分配?无论如何,这就是我开始寻找的地方。也许在 NSOperation 的“finished”属性上放置一个断点,看看会发生什么......

关于ios - 未释放的 KVO 发生奇怪的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316800/

相关文章:

objective-c - obj-c 到 Swift 转换代码

objective-c - 使用 NSArray 时出现 NSInvalidArgumentException

cocoa - 从共享实用程序窗口和最前面的文档窗口进行绑定(bind)的好方法是什么?

ios - 如何使用 UIPageViewController

ios - Facebook 登录的预期行为是什么?

objective-c - 如何在 mac os x 中安装 OCLint

ios - 一个接一个地执行动画,由 KVO 命中(在异步 URLRequest 之后)

ios - 如何根据播放时间观察MPMoviePlayerController?

ios - 如何在 iOS swift 中检索缓存文件?

ios - 使 iPhone 6/6 plus 自动调整应用程序大小