我在尝试保存上下文时遇到此异常:
无法识别的选择器发送到实例0x5937b60
我有另一个UITableViewController的类似代码,它工作正常。我比较两者以确保我以同样的方式做事情,乍一看,它们看起来几乎相同。奇怪的是,抛出异常后我的应用程序确实保存了上下文。当我重新运行它时,我可以看到对我的模型所做的更改。
我用代码构建了所有界面(没有IB)。
我读到这个问题通常没有任何内容与CoreData试图保存,而是与其他一些委托发送消息到这个无法理解的上下文。在实际发生的地方,我无能为力。
堆栈如下所示:
0 CoreFoundation 0x00fbd5a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x01111313 objc_exception_throw + 44
2 CoreFoundation 0x00fbf0bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00f2e966 ___forwarding___ + 966
4 CoreFoundation 0x00f2e522 _CF_forwarding_prep_0 + 50
5 Foundation 0x007aa669 _nsnote_callback + 145
6 CoreFoundation 0x00f959f9 __CFXNotificationPost_old + 745
7 CoreFoundation 0x00f1493a _CFXNotificationPostNotification + 186
8 Foundation 0x007a020e -[NSNotificationCenter postNotificationName:object:userInfo:] + 134
9 CoreData 0x00d295b9 -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] + 1513
10 CoreData 0x00d2388a -[NSManagedObjectContext save:] + 522
11 TimeManager 0x0000fe9d -[WorkTimeRootViewController viewController:didFinishWithSave:] + 253
12 TimeManager 0x00012b73 -[AddWorkTimeViewController save:] + 83
13 UIKit 0x000384fd -[UIApplication sendAction:to:from:forEvent:] + 119
14 UIKit 0x0024acc3 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 156
15 UIKit 0x000384fd -[UIApplication sendAction:to:from:forEvent:] + 119
16 UIKit 0x000c8799 -[UIControl sendAction:to:forEvent:] + 67
17 UIKit 0x000cac2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
18 UIKit 0x000c97d8 -[UIControl touchesEnded:withEvent:] + 458
19 UIKit 0x0005cded -[UIWindow _sendTouchesForEvent:] + 567
20 UIKit 0x0003dc37 -[UIApplication sendEvent:] + 447
21 UIKit 0x00042f2e _UIApplicationHandleEvent + 7576
22 GraphicsServices 0x011f6992 PurpleEventCallback + 1550
23 CoreFoundation 0x00f9e944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
24 CoreFoundation 0x00efecf7 __CFRunLoopDoSource1 + 215
25 CoreFoundation 0x00efbf83 __CFRunLoopRun + 979
26 CoreFoundation 0x00efb840 CFRunLoopRunSpecific + 208
27 CoreFoundation 0x00efb761 CFRunLoopRunInMode + 97
28 GraphicsServices 0x011f51c4 GSEventRunModal + 217
29 GraphicsServices 0x011f5289 GSEventRun + 115
30 UIKit 0x00046c93 UIApplicationMain + 1160
31 TimeManager 0x00001c79 main + 121
32 TimeManager 0x00001bf5 start + 53
这是应用程序崩溃的方法:
- (void)viewController:(id)controller didFinishWithSave:(BOOL)save
{
if (save)
{
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self selector:@selector(addControllerDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.addingManagedObjectContext];
NSError *error;
if (![self.addingManagedObjectContext save:&error]) // it crashes here!
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.addingManagedObjectContext];
}
self.addingManagedObjectContext = nil;
[self dismissModalViewControllerAnimated:YES];
}
我不知道应该附加哪些代码,因为我不确定是什么导致了这个问题。 任何帮助将非常感谢!!!
答案 0 :(得分:2)
三重检查选择器的拼写/大小写。看起来好像你可能正在为一个实际上不存在的方法添加一个观察者,并且因为XCode无法为你验证选择器,通常会有一个愚蠢的拼写错误导致这些类型的崩溃。
另外 - 三重检查如果方法需要一个对象,则在选择器的末尾有一个:如果方法不期望一个对象,则同样确保没有一个对象。 :非常重要。
检查您在此处显示的代码以外的其他代码。