更改核心数据项崩溃应用程序

问题描述:

我遇到了另一个问题,我的Iphone应用程序无法解决我自己。 我在我的最新应用中实现了一种组织者功能。 在那里可以创建约会,这些约会显示在tableview中并保存在CoreDataStore中。我用4类:更改核心数据项崩溃应用程序

  • 哪里约会显示
  • 与文本框,以便投入值地点和约定的名称概述(创建/编辑视图)
  • 与DatePicker的一个视图定义启动 - 和ENDDATE
  • 控制器,其处理使用该方法的产品创建和删除:

的代码:

-(void)createAppointmentObjectWithDate:(NSDate *) 
        appointmentDate name:(NSString *)appointmentName 
          description:(NSString *)appointmentDescription 
           eDate:(NSDate *)appointmentEndDate 
{ 
    NSManagedObjectContext *managedObjectContext = [[CoreDataManager sharedManager] managedObjectContext]; 
    AppointmentObject *newAppointmentObject = [NSEntityDescription insertNewObjectForEntityForName:AppointmentObjectEntityName 
                      inManagedObjectContext:managedObjectContext];  
    newAppointmentObject.appointmentName = appointmentName; 
    newAppointmentObject.appointmentDescription = appointmentDescription; 
    newAppointmentObject.appointmentDate = [appointmentDate earlierDate:appointmentEndDate]; 
    newAppointmentObject.appointmentEndDate = [appointmentEndDate laterDate:appointmentDate]; 
} 

-(void)deleteAppointmentObject:(AppointmentObject *)appointmentObject triggeredByUser:(BOOL)byUser{ 
    NSManagedObjectContext *managedObjectContext = [[CoreDataManager sharedManager] managedObjectContext]; 
    [managedObjectContext deleteObject:appointmentObject]; 
} 

但所有种类的疯狂的事情正在发生,这使得我的应用程序崩溃与“SICBART”消息:

2010-10-13 17:35:04.630 didacta[109:307] Serious application error. Exception was  caught during Core Data change processing. 
This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. 
-[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x19f150 with userInfo (null) 
2010-10-13 17:35:05.118 didacta[109:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x19f150' 

中出现错误,而这样做:

  • 创造新的任命和按“完成“(应触发创建和弹出概述)
  • 更改约会并按下”完成“(应发送更改并弹出概述)
  • 点击关于指定换货的概述(应该弹出创建/编辑视图,交出值)
  • 删除项目

有时我甚至可以删除约会,但随后的项目中实现代码如下顺序以某种方式得到扭转,在tableview的索引不再指向约会的索引。

对。

-[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x19f150 with userInfo (null)

这是你的错误。你有一个NSFetchedResultsController,它的委托是一个CALayer。这听起来像原来的代表被释放,CALayer分配使用相同的内存区域。解决的办法是找到有问题的-dealloc,并假设您使用属性添加类似self.myFetchedResultsController.delegate = nil; self.myFetchedResultsController = nil;的东西。

你有时可以有助于使僵尸调试这样的事情(转到项目→编辑当期可执行左右,选择环境,添加NSZombieEnabled环境变量,并将其值设置为“YES”或左右;取消选中该复选框时你已经完成调试)。当消息发送到解除分配的对象时,僵尸会引发异常。 (僵尸不会在默认情况下解除分配,因此您的应用程序将会有效泄漏;请记住取消选中复选框!)。

+0

我再次搜索了代码,但是没有地方可以取消分配代理。但现在我终于可以重现一个错误:我的约会按日期排序。当我更改某个项目的日期时,由于某种原因,Tableview停止刷新。但是,我通过fetchedResults控制器得到的项目顺序仍然正确(在正确的位置使用更改日期的项目)。我通过viewWillAppear中的“reloaddata”更新Tableview。这可能是一个痕迹? – Amandir 2010-10-14 16:17:06

+0

更确切地说:CellForRow不再被调用。不是通过委托而是通过reloadData。当我关闭应用程序并重新启动它。约会是正确的顺序和tableView的更新再次工作。 – Amandir 2010-10-14 16:54:14

+0

他意味着您要么取消分配获取的结果控制器的委托,要么已将CALayer分配为委托。当您更改数据时,CALayer将收到委托错误。如果错误是一致的,那么您已将CALayer指定为代码中的代理。 – TechZen 2010-10-15 21:42:31

“无法识别的选择器”使它听起来像也许你的数据模型不包含你试图使用的一些实体属性。例如,也许你正试图设置不存在的对象的属性。

尝试在newAppointmentObject.appointmentName = appointmentName;处创建一个断点并逐步查看错误发生的位置。