保存coredata上下文时,“无法识别的选择器发送到实例***”异常

时间:2011-07-03 12:39:57

标签: iphone objective-c xcode ipad

我在尝试保存上下文时遇到此异常:

无法识别的选择器发送到实例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];
}

我不知道应该附加哪些代码,因为我不确定是什么导致了这个问题。 任何帮助将非常感谢!!!

1 个答案:

答案 0 :(得分:2)

三重检查选择器的拼写/大小写。看起来好像你可能正在为一个实际上不存在的方法添加一个观察者,并且因为XCode无法为你验证选择器,通常会有一个愚蠢的拼写错误导致这些类型的崩溃。

另外 - 三重检查如果方法需要一个对象,则在选择器的末尾有一个:如果方法不期望一个对象,则同样确保没有一个对象。 :非常重要。

检查您在此处显示的代码以外的其他代码。