NSKeyValueNotifyObserver中的NSOperation崩溃

时间:2014-06-02 15:58:19

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

我们的应用程序自发布以来发生了崩溃。我们已经解决了所有其他大型崩溃问题,只留下了这一次。 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。
  • 主线程通常是做某事,但通常不使用任何共享资源。
  • 我无法在调试器中重现它,因此它可能只是一个设备错误。

我很感激任何想法或洞察这次崩溃的原因。

1 个答案:

答案 0 :(得分:0)

这绝对是多线程问题。

假设:

可能是因为函数在下一次调用之前启动并在下一次调用之后结束:

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

此处描述类似的问题,但对于NSNotificationCenter:

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

祝你好运。