代码之家  ›  专栏  ›  技术社区  ›  kdbdallas

nsmanagedobjectcontext处理pendingchanges期间核心数据崩溃

  •  4
  • kdbdallas  · 技术社区  · 16 年前

    我得到一个(在我看来是一个奇怪的)与核心数据崩溃。 据我所知,当核心数据执行保存时,会发生这种情况,随后的managedobjectcontextdidsave方法会被触发。

    我茫然不知所措,真的希望有人能帮助我,或引导我朝正确的方向前进。

    事故报告如下:

    Exception Type:  EXC_BAD_ACCESS (SIGBUS)
    Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000b
    Crashed Thread:  0
    
    Thread 0 Crashed:
    0   libobjc.A.dylib                 0x000026f4 objc_msgSend + 16
    1   Foundation                      0x000437a4 NSClassFromObject + 8
    2   Foundation                      0x0000ba54 _NSIMPForObjectAndSelector + 4
    3   Foundation                      0x00095eae -[NSSortDescriptor compareObject:toObject:] + 110
    4   CoreData                        0x000b0a6e +[NSFetchedResultsController(PrivateMethods) _insertIndexForObject:inArray:lowIdx:highIdx:sortDescriptors:] + 174
    5   CoreData                        0x000b1496 -[NSFetchedResultsController(PrivateMethods) _postprocessInsertedObjects:] + 342
    6   CoreData                        0x000b32d6 -[NSFetchedResultsController(PrivateMethods) _postprocessUpdatedObjects:] + 430
    7   CoreData                        0x000b2a5e -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 498
    8   Foundation                      0x0004bbf6 _nsnote_callback + 162
    9   CoreFoundation                  0x00050af2 _CFXNotificationPostNotification + 298
    10  Foundation                      0x000497f4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
    11  CoreData                        0x0002e42e -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 66
    12  CoreData                        0x0007fd26 -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 134
    13  CoreData                        0x0001670a -[NSManagedObjectContext(_NSInternalChangeProcessing) _postRefreshedObjectsNotificationAndClearList] + 70
    14  CoreData                        0x000164ac -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 1656
    15  CoreData                        0x0004b5fa -[NSManagedObjectContext processPendingChanges] + 10
    16  CoreData                        0x0003e2a4 _performRunLoopAction + 120
    17  CoreFoundation                  0x0000fb50 __CFRunLoopDoObservers + 420
    18  CoreFoundation                  0x00056a32 CFRunLoopRunSpecific + 1734
    19  CoreFoundation                  0x00056356 CFRunLoopRunInMode + 42
    20  GraphicsServices                0x00003cb8 GSEventRunModal + 108
    21  GraphicsServices                0x00003d64 GSEventRun + 56
    22  UIKit                           0x00002768 -[UIApplication _run] + 384
    23  UIKit                           0x0000146c UIApplicationMain + 688
    24  MyApp                           0x000022d2 main (main.m:14)
    25  MyApp                           0x00002248 start + 44
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   mbauman    16 年前

    看起来某个数据库数组中的某个项被释放了太多次(因此被释放)。尝试对数组进行排序时崩溃,并与已释放的对象进行比较。

    尝试使用运行程序 NSZombieEnabled --它防止解除分配,以便您可以看到哪个对象正在获取发送给它的保留计数为0的消息。

        2
  •  1
  •   Marcus S. Zarra    16 年前

    如果您使用的是nsfetchedresultscontroller,则该代码中可能有错误,而且不容易看到。我建议在nsfetchedresultscontroller委托方法中放入一些日志语句,并观察哪个被激发。

    由于nsfrc是作为nsmanagedobjectcontext的save例程的一部分触发的,因此其委托中的错误很容易被误解为save本身中的错误。

    更新1

    如果是在约会,那么也许当你把约会定在某个地方的时候,你自己就夸大了?也许打电话给 -release 在一 [NSDate date] . 在核心数据试图访问日期对象之前,这种类型的错误将被隐藏。