私は数日間この問題について頭を悩まされてしまい、すべての正気を失いました。 :|iOSクラッシュバックグラウンドから再開した後にNSManagedObjectContextでロールバックを呼び出す
私のアプリはアクティブでバックグラウンドでデバイスの位置を追跡するように設定されており、CoreDataを使用してトラックデータを作成して保存しています。主要なCoreDataエンティティは、多くの "RoutePoint"エンティティを持つ "Route"です。デバイスがアプリのCLLocationManagerから新しい場所を受け取ると、新しいルートポイントオブジェクトが親ルートに追加されます。
ユーザーが追跡を停止すると、ルートを保存または破棄することができます。ルートを破棄すると[_moc rollback]が呼び出され、もちろんsaveは[_moc save]を呼び出します。私は、私のNSManagedObjectContextインスタンスをAppDelegateで参照する方法を使用していますが、これは保持されず、UIViewControllerのいずれかで解放されていないシングルトンオブジェクトではありません。
トラッキングがアクティブなときにユーザーがアプリをバックグラウンドに送信すると、問題が発生します(ルートとルートポイントのエンティティは実際に_mocに保存されません)。アプリがアクティブ状態に戻ったとき、ユーザーはアプリがクラッシュする(「ロールバック」を呼び出す)ルートを選択して破棄することを選択します。しかし、同じプロセスが繰り返されても、ユーザーが廃棄するのではなく経路を保存すると、クラッシュは発生せず、正常に保存されます。ハァッ!
この問題が発生したとき、私は、GDBに入る唯一のものは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のロールバック]呼び出しの問題のように見えるが、私私のMOCインスタンスをそのUIViewControllerに保持したり解放したりするなど、広範な検索を行い、さまざまなことを試みましたが、まだ何も機能していません。明らかに、アプリがバックグラウンドに入ったときに何かが間違っているのですが、それはMOCに関連していて、保存すると同様のクラッシュは起きませんでしたか?
大変ありがとうございます。 :)