从后台恢复后,iOS崩溃调用NSManagedObjectContext上的回滚

时间:2011-01-18 21:31:37

标签: ios core-data ios4 crash

我已经在这个问题上抨击了好几天,现在无济于事,失去了所有的理智。 :|

我的应用程序设置为在活动时和后台跟踪设备的位置,我正在使用CoreData创建和存储跟踪数据。主要CoreData实体是“Route”,它具有许多“RoutePoint”实体。当设备从应用程序的CLLocationManager接收新位置时,会将新的RoutePoint对象添加到其父路径。

当用户停止跟踪时,他们可以选择保存或丢弃路线。丢弃路由只需调用[_moc rollback],当然save会调用[_moc save]。我正在使用在AppDelegate上引用我的NSManagedObjectContext实例的方法而不是单个对象,该对象在我的任何UIViewControllers中都没有被保留或释放。

如果用户在跟踪处于活动状态时将应用程序发送到后台(因此Route和RoutePoint实体实际上未保存到_moc),则会出现问题。当应用程序返回活动状态时,用户停止路由选择丢弃应用程序崩溃时(称为“回滚”)。但是,如果重复相同的过程但用户保存路线而不是丢弃,则不会发生崩溃并且保存成功。咦?!

当发生这种情况时,我唯一得到的是EXC_BAD_ACCESS,所以我做了一个回溯,这是结果:

#0  0x34a80464 in objc_msgSend ()
#1  0x356ea6d6 in -[_PFManagedObjectReferenceQueue _processReferenceQueue:] ()
#2  0x356ea3d4 in -[NSManagedObjectContext(_NSInternalNotificationHandling) _processReferenceQueue:] ()
#3  0x356ea084 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] ()
#4  0x3571fb14 in -[NSManagedObjectContext processPendingChanges] ()
#5  0x357603ee in -[NSManagedObjectContext rollback] ()
#6  0x00031862 in -[RouteHistoryDetailViewController discardRoute] (self=0x4a0fc30, _cmd=0x100941)
#7  0x0003064c in -[RouteHistoryDetailViewController alertView:clickedButtonAtIndex:] (self=0x4a0fc30, _cmd=0x344b7f5f, alertView=0x390aa0, buttonIndex=0)
#8  0x3445d63e in -[UIAlertView(Private) _buttonClicked:] ()
#9  0x35821fec in -[NSObject(NSObject) performSelector:withObject:withObject:] ()
#10 0x341c84ac in -[UIApplication sendAction:to:from:forEvent:] ()
#11 0x341c844c in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#12 0x341c841e in -[UIControl sendAction:to:forEvent:] ()
#13 0x341c8170 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#14 0x341c89ce in -[UIControl touchesEnded:withEvent:] ()
#15 0x341be354 in -[UIWindow _sendTouchesForEvent:] ()
#16 0x341bdcce in -[UIWindow sendEvent:] ()
#17 0x341a8fc6 in -[UIApplication sendEvent:] ()
#18 0x341a8906 in _UIApplicationHandleEvent ()
#19 0x320c8f02 in PurpleEventCallback ()
#20 0x3580f6fe in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#21 0x3580f6c2 in __CFRunLoopDoSource1 ()
#22 0x35801f7c in __CFRunLoopRun ()
#23 0x35801c86 in CFRunLoopRunSpecific ()
#24 0x35801b8e in CFRunLoopRunInMode ()
#25 0x320c84aa in GSEventRunModal ()
#26 0x320c8556 in GSEventRun ()
#27 0x341dc328 in -[UIApplication _run] ()
#28 0x341d9e92 in UIApplicationMain ()
#29 0x00002982 in main (argc=1, argv=0x2fdff5a8)

所以它似乎是调用[_moc rollback]的问题,但我已经做了大量的搜索并尝试了各种各样的事情,甚至在UIViewController中保留和释放我的MOC实例,但是还没有任何工作。显然,当应用程序进入后台时出现问题,但它与MOC有关,那么在保存时也不会发生类似的崩溃吗?

非常感谢您的建议! :)

1 个答案:

答案 0 :(得分:1)

我总是在我的物品上留下一个标志,并在willResignActive中执行保存,其中任何“未确认”的物品都有flag = true。然后当我恢复(或启动)如果我想丢弃它们时,我可以删除flag = true并删除它们......这样我仍然可以保存或撤消,即使iOS由于内存压力而关闭我的应用程序。

IIRC您当前的设计意味着如果有人打开Safari等,并且您的应用程序关闭,即使用户想要返回并保存它,路由也会永久消失,因为更改仅在内存中。