-observeValueForKeyPath:ofObject:change:context:收到但未处理的消息 [英] An -observeValueForKeyPath:ofObject:change:context: message was received but not handled

查看:148
本文介绍了-observeValueForKeyPath:ofObject:change:context:收到但未处理的消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对KVO比较陌生,所以我很有可能违反了一些基本规则。我正在使用核心数据。

I am relatively new to KVO, so there is a good chance that I am violating some fundamental rule. I am using Core Data.

我的应用程序崩溃时出现以下消息:我无法理解的是为什么CGImage会参与观察设置的值。在MeasurementPointer对象

My app crashes with the following message: And what I can't understand is why a CGImage is getting involved in observing a value that is set on a MeasurementPointer object.

        *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<CGImage 0x276fc0>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: measurementDescriptor
Observed object: <MeasurementPointer: 0x8201640> (entity: MeasurementPointer; id: 0x8200410 <x-coredata://EBEE0687-D67D-4B03-8C95-F4C60CFDC20F/MeasurementPointer/p75> ; data: {
    measurementDescriptor = "0x260fd0 <x-coredata://EBEE0687-D67D-4B03-8C95-F4C60CFDC20F/MeasurementDescriptor/p22>";
})
Change: {
    kind = 1;
    new = "<MeasurementDescriptor: 0x262530> (entity: MeasurementDescriptor; id: 0x260fd0 <x-coredata://EBEE0687-D67D-4B03-8C95-F4C60CFDC20F/MeasurementDescriptor/p22> ; data: {\n    measurementName = Temperature;\n    measurementUnits = \"\\U00b0C\";\n    sortString = nil;\n})";
}
Context: 0x0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x30897ed3 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x3002f811 objc_exception_throw + 24
    2   CoreFoundation                      0x30897d15 +[NSException raise:format:arguments:] + 68
    3   CoreFoundation                      0x30897d4f +[NSException raise:format:] + 34
    4   Foundation                          0x34a13779 -[NSObject(NSKeyValueObserving) observeValueForKeyPath:ofObject:change:context:] + 60
    5   Foundation                          0x349b6acd NSKeyValueNotifyObserver + 216
    6   Foundation                          0x349b6775 NSKeyValueDidChange + 236
    7   Foundation                          0x349ae489 -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 76
    8   CoreData                            0x3165b577 _PF_ManagedObject_DidChangeValueForKeyIndex + 102
    9   CoreData                            0x3165ac51 _sharedIMPL_setvfk_core + 184
    10  CoreData                            0x3165dc83 _svfk_0 + 10
    11  SPARKvue                            0x000479f1 -[MeasurementViewController doneAction:] + 152
    12  CoreFoundation                      0x3083f719 -[NSObject(NSObject) performSelector:withObject:withObject:] + 24
    13  UIKit                               0x31eb1141 -[UIApplication sendAction:to:from:forEvent:] + 84
    14  UIKit                               0x31f08315 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 92
    15  CoreFoundation                      0x3083f719 -[NSObject(NSObject) performSelector:withObject:withObject:] + 24
    16  UIKit                               0x31eb1141 -[UIApplication sendAction:to:from:forEvent:] + 84
    17  UIKit                               0x31eb10e1 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
    18  UIKit                               0x31eb10b3 -[UIControl sendAction:to:forEvent:] + 38
    19  UIKit                               0x31eb0e05 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 356
    20  UIKit                               0x31eb1453 -[UIControl touchesEnded:withEvent:] + 342
    21  UIKit                               0x31eafddd -[UIWindow _sendTouchesForEvent:] + 368
    22  UIKit                               0x31eaf757 -[UIWindow sendEvent:] + 262
    23  UIKit                               0x31eaa9ff -[UIApplication sendEvent:] + 298
    24  UIKit                               0x31eaa337 _UIApplicationHandleEvent + 5110
    25  GraphicsServices                    0x31e4504b PurpleEventCallback + 666
    26  CoreFoundation                      0x3082cce3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
    27  CoreFoundation                      0x3082cca7 __CFRunLoopDoSource1 + 166
    28  CoreFoundation                      0x3081f56d __CFRunLoopRun + 520
    29  CoreFoundation                      0x3081f277 CFRunLoopRunSpecific + 230
    30  CoreFoundation                      0x3081f17f CFRunLoopRunInMode + 58
    31  GraphicsServices                    0x31e445f3 GSEventRunModal + 114
    32  GraphicsServices                    0x31e4469f GSEventRun + 62
    33  UIKit                               0x31e51123 -[UIApplication _run] + 402
    34  UIKit                               0x31e4f12f UIApplicationMain + 670
    35  SPARKvue                            0x000031ff main + 70
    36  SPARKvue                            0x000031b4 start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal:  "SIGABRT".

触发此操作所发生的一切是:

All that is happening to trigger this is:

[[self measurementPointer] setMeasurementDescriptor:descriptor];

鉴于此,

[[meterDisplay measurementPointer] addObserver:self 
            forKeyPath:@"measurementDescriptor"
            options:NSKeyValueObservingOptionNew
            context:nil];

基本上,MeasurementPointer对象指向MeasurementDescriptor对象 - 两者都是NSManagedObject子类。 MeasurementDescriptor对象描述特定的测量和单位组合(例如,温度(°C)或风速(mph))。 MeasurementDescriptors就像单例一样,每个唯一的测量单元组合只有一个。

Basically, MeasurementPointer objects point to MeasurementDescriptor objects - and both are NSManagedObject subclasses. MeasurementDescriptor objects describe a specific 'measurement' and 'unit' combination (e.g., "Temperature (°C)" or "Wind Speed (mph)"). MeasurementDescriptors are something like singletons to the extent that there is only one for each unique measurement-unit combo.

MeasurementPointers由其他对象引用 - 包括Model对象和Controller对象。 MeasurementPointer引用MeasurementDescriptor。许多对象都想知道MeasurementPointer何时开始引用新的/不同的MeasurementDescriptor。例如,这种改变可能导致图形显示的轴发生变化。或者,在上面的代码中,可能会导致仪表显示显示不同的样本(来自选定的一组样本)。

MeasurementPointers are referenced by other objects - both Model objects and Controller objects. A MeasurementPointer references a MeasurementDescriptor. Many objects are interested in knowing when a MeasurementPointer starts referencing a new/different MeasurementDescriptor. Such a change might cause a graph display's axis to change, for example. Or, in the code above, might cause a meter display to show a different sample (from a selected set of samples).

我认为基本问题是CGImage正在收到一条不适合它的消息......不幸的是,这是间歇性的,所以我找不到触发它的模式。

I think that fundamental problem is that a CGImage is receiving a message that is not intended for it... unfortunately, this is intermittent, so I have not been able to find a pattern that triggers it.

推荐答案

你有一个被释放的物体,并没有停止观察另一个物体。遍历所有 -addObserver ... 调用并确保它们与 -removeObserver ... 调用相匹配至少在 -dealloc 中,可能在 -viewDidUnload 中,具体取决于您的应用程序结构。

You have an object that got dealloc'ed and did not stop observing another object. Walk through all of your -addObserver... calls and make sure they are matched with -removeObserver... calls at least in the -dealloc and possibly in the -viewDidUnload depending on your application structure.

这篇关于-observeValueForKeyPath:ofObject:change:context:收到但未处理的消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆