【问题标题】:NSOperation crash in NSKeyValueNotifyObserverNSKeyValueNotifyObserver 中的 NSOperation 崩溃
【发布时间】:2014-06-02 15:58:19
【问题描述】:

我们的应用自发布以来就发生了崩溃。我们已经修复了所有其他重大崩溃,只剩下这一次。 Crashlytics 像这样报告崩溃:

Crashed: com.apple.root.default-priority
EXC_BREAKPOINT UNKNOWN at 0x0000defe

Thread : Crashed: com.apple.root.default-priority
0  libsystem_platform.dylib       0x3894b620 _os_lock_corruption_abort + 18446744073709552000
1  libsystem_platform.dylib       0x3894b61f _OSSpinLockLockSlow$VARIANT$wfe + 98
2  Foundation                     0x2e9ad333 __NSOQSchedule + 50
3  Foundation                     0x2e90cfaf +[__NSOperationInternal _observeValueForKeyPath:ofObject:changeKind:oldValue:newValue:indexes:context:] + 1198
4  Foundation                     0x2e90ca0b NSKeyValueNotifyObserver + 90
5  Foundation                     0x2e90c765 NSKeyValueDidChange + 344
6  Foundation                     0x2e90be61 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:] + 508
7  Foundation                     0x2e9ad1f9 __103+[__NSOperationInternal _observeValueForKeyPath:ofObject:changeKind:oldValue:newValue:indexes:context:]_block_invoke + 108
8  libdispatch.dylib              0x3881e0c3 _dispatch_call_block_and_release + 10
9  libdispatch.dylib              0x388237d9 _dispatch_root_queue_drain + 224
10 libdispatch.dylib              0x388239c5 _dispatch_worker_thread2 + 56
11 libsystem_pthread.dylib        0x3894ddff _pthread_wqthread + 298

注意事项:

  • 内存地址始终为 0x0000defe。
  • 它总是发生在后台线程上。
  • __NSOperationInternal 表明这是一个 NSOperation 错误。
  • 我们的代码不会显示在此线程的堆栈跟踪中的任何位置。
  • 我们在一些地方使用 NSOperations,包括 AFNetworking。
  • 主线程通常在做某事,但通常不使用任何共享资源。
  • 我无法在调试器中重现它,因此它可能是一个仅限设备的错误。

我很感激任何关于为什么会发生这种崩溃的想法或见解。

【问题讨论】:

  • 这听起来像是越狱特有的崩溃。报告崩溃的设备是否越狱?
  • @remus 这绝对不是越狱专用的。它的发生率非常高,并且发生在我认识的没有越狱的朋友身上。
  • Hrmmmmm 值得一试!

标签: objective-c nsoperation key-value-observing


【解决方案1】:

这绝对是多线程问题。

假设:

这可能是函数在下次调用之前启动并在下次调用之后完成的原因:

[someObj removeObserver: self forKeyPath: @"xxx"];

这里描述了类似的问题,但针对 NSNotificationCenter:

http://lapcatsoftware.com/articles/nsnotificationcenter-is-threadsafe-not.html

祝你好运。

【讨论】:

  • 是的,锁损坏强烈表明某些东西试图在僵尸对象中使用互斥锁。根据我的阅读,KVO 和 NSNotificationCenter 应该专门用于在严格的程序控制下消失的对象中,即只有一个对该对象的引用并且它永远不会为零或将它为零的代码执行受控首先拆除(无效)调用。其他任何事情都是有风险的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多