Ios 什么';这是核心数据崩溃的可能原因

Ios 什么';这是核心数据崩溃的可能原因,ios,core-data,nsfetchedresultscontroller,Ios,Core Data,Nsfetchedresultscontroller,首先,很抱歉,我想不出一个更好的题目来回答这个问题 这是一个崩溃,我不能重复自己,但发生在用户多次。我正在使用HockeyApp()收集碰撞报告。所以我无法调试这个问题,我只能读取调用堆栈。但我看了之后,一点也不知道出了什么问题。我在中间省略了几个不相关的函数调用。 对于UI部分,我使用NSFetchedResultsController来填充UITableView 对于核心数据部分,我使用ios5新引入的父子MOC:主队列使用父MOC,资源获取队列使用子MOC。我在处理提取的数据后保存子MOC

首先,很抱歉,我想不出一个更好的题目来回答这个问题

这是一个崩溃,我不能重复自己,但发生在用户多次。我正在使用HockeyApp()收集碰撞报告。所以我无法调试这个问题,我只能读取调用堆栈。但我看了之后,一点也不知道出了什么问题。我在中间省略了几个不相关的函数调用。

对于UI部分,我使用
NSFetchedResultsController
来填充
UITableView

对于核心数据部分,我使用ios5新引入的父子MOC:主队列使用父MOC,资源获取队列使用子MOC。我在处理提取的数据后保存子MOC。一旦我保存了子MOC,核心数据应将更改自动推送到父MOC中,FRC应通过其委托查看更改并更新表视图。然后我调用主线程进行额外的UI更新

具体地说,我可以理解如何将
[UITableView indexPathForRowAtPoint:
调用到
[nsfetchedresultscocontroller objectAtIndexPath:
,但我不明白为什么它最终调用了我的实体的
initWithEntity:InsertingManagedObjectContext:
,为什么
initWithEntity:InsertingManagedObjectContext:
会导致未实现的错误。我认为
[NSFetchedResultsController objectAtIndexPath:
应该执行
fetch
,但它确实在这里插入了
insert

Exception Type:  SIGABRT
Exception Codes: #0 at 0x35e7e32c
Crashed Thread:  0

Application Specific Information:
*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0xe62bdc0 <x-coredata://327F5799-CAB1-4086-8E75-0E87F0E19BF0/Status/p385>''

Last Exception Backtrace:
0   CoreFoundation                      0x355c888f __exceptionPreprocess + 162
1   libobjc.A.dylib                     0x3796f259 objc_exception_throw + 32
2   CoreData                            0x35f124f3 _PFFaultHandlerLookupRow + 1098
3   CoreData                            0x35f11d5b _PF_FulfillDeferredFault + 194
4   CoreData                            0x35f11c0b _sharedIMPL_pvfk_core + 38    
5   XXX                                0x0008a5c3 -[Tweet initWithEntity:insertIntoManagedObjectContext:] (Tweet.m:125)
6   XXX                                0x0003fd1b -[Status initWithEntity:insertIntoManagedObjectContext:] (Status.m:333)
7   CoreData                            0x35f0eded -[NSManagedObject(_NSInternalMethods) _initWithEntity:withID:withHandler:withContext:] + 164
8   CoreData                            0x35f0de07 -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:] + 134
9   CoreData                            0x35f6b6eb _PFRetainedObjectIDCore + 330
10  CoreData                            0x35f67065 -[NSManagedObjectContext objectWithID:] + 88
11  CoreData                            0x35f32c09 _faultBatchAtIndex + 1352
12  CoreData                            0x35f31e73 -[_PFBatchFaultingArray objectAtIndex:] + 42
13  CoreData                            0x35f30a87 -[_PFMutableProxyArray objectAtIndex:] + 82
14  CoreData                            0x35fdd81d -[NSFetchedResultsController objectAtIndexPath:] + 204
16  XXX                                0x0009ebab -[TweetsViewController tableView:heightForRowAtIndexPath:] (TweetsViewController.m:581)
17  UIKit                               0x3304dab5 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2548
18  UIKit                               0x33067c3b -[UITableViewRowData rectForSection:] + 302
19  UIKit                               0x33125981 -[UITableViewRowData indexPathsForRowsInRect:] + 136
20  UIKit                               0x331258f1 -[UITableView indexPathsForRowsInRect:] + 52
21  UIKit                               0x33125889 -[UITableView indexPathForRowAtPoint:] + 28
22  XXX                                0x0009c193 -[TweetsViewController updateUI] (TweetsViewController.m:211)
25  XXX                                0x00111a6f __block_global_1 (ResourceFetcher.m:68)
26  libdispatch.dylib                   0x34458b87 _dispatch_barrier_sync_f_slow_invoke + 82
27  libdispatch.dylib                   0x34457ee7 _dispatch_main_queue_callback_4CF$VARIANT$mp + 194
28  CoreFoundation                      0x3559b2ad __CFRunLoopRun + 1268
29  CoreFoundation                      0x3551e4a5 CFRunLoopRunSpecific + 300
30  CoreFoundation                      0x3551e36d CFRunLoopRunInMode + 104
31  GraphicsServices                    0x371ba439 GSEventRunModal + 136
32  UIKit                               0x3302acd5 UIApplicationMain + 1080
33  XXX                                0x000044ff main (main.m:16)
34  XXX                                0x00003c50 start + 40
异常类型:SIGABRT
异常代码:#0位于0x35e7e32c
崩溃线程:0
特定于应用程序的信息:
***由于未捕获的异常“NSObjectInaccessibleException”而终止应用程序,原因:“CoreData无法实现“0xe62bdc0”的故障”
上次异常回溯:
0 CoreFoundation 0x355c888f例外预处理+162
1 libobjc.A.dylib 0x3796f259 objc_异常_抛出+32
2芯数据0x35f124f3 _PFFaultHandlerLookupRow+1098
3芯数据0x35f11d5b _PF_满足故障+194
4 CoreData 0x35f11c0b\u sharedIMPL\u pvfk\u core+38
5 XXX 0x0008a5c3-[Tweet initWithEntity:insertIntoManagedObjectContext:](Tweet.m:125)
6 XXX 0x0003fd1b-[状态initWithEntity:insertIntoManagedObjectContext:](状态m:333)
7 CoreData 0x35f0eded-[NSManagedObject(\u NSInternalMethods)\u initWithEntity:withID:withHandler:withContext:+164
8 CoreData 0x35f0de07-[NSManagedObjectContext(\u NSInternalAdditions)\u保留ID为:optionalHandler:withInlineStorage:+134的对象
9芯数据0x35f6b6eb _PFRETAINEDOBJECTOR+330
10 CoreData 0x35f67065-[NSManagedObjectContext对象,ID::+88
11 CoreData 0x35f32c09_faultBatchAtIndex+1352
12核心数据0x35f31e73-[\u PFBatchFaultingArray objectAtIndex:][42
13 CoreData 0x35f30a87-[\u PFMutableProxyArray objectAtIndex:][82
14 CoreData 0x35fdd81d-[NSFetchedResultsController对象索引路径:][204
16 XXX 0x0009ebab-[TweetsViewController表视图:Rowatindexpath的高度:](TweetsViewController.m:581)
17 UIKit 0x3304dab5-[UISectionRowData refreshWithSection:tableView:tableViewRowData:+2548
18 UIKit 0x33067c3b-[UITableViewRowData rectForSection:][302
19 UIKit 0x33125981-[UITableViewRowData索引路径错误插入:+136
20 UIKit 0x331258f1-[UITableView索引路径错误插入:+52
21 UIKit 0x33125889-[UITableView indexPathForRowAtPoint:+28
22 XXX 0x0009c193-[TweetsViewController updateUI](TweetsViewController.m:211)
25 XXX 0x00111a6f块全局1(ResourceFetcher.m:68)
26 libdispatch.dylib 0x34458b87 _dispatch_barrier_sync_f_slow_invoke+82
27 libdispatch.dylib 0x34457ee7_dispatch_main_queue_callback_4CF$VARIANT$mp+194
28 CoreFoundation 0x3559b2ad _ucfrunlooprun+1268
29 CoreFoundation 0x3551e4a5 CFRUNLOOPSCRONE+300
30 CoreFoundation 0x3551e36d CFRUNLOOPSRUNINMODE+104
31图形服务0x371ba439 GSEventRunModal+136
32 UIKit 0x3302acd5 UIApplicationMain+1080
33 XXX 0x000044ff干管(干管m:16)
34 XXX 0x00003c50启动+40

有这种崩溃问题的用户通常会看到表视图在崩溃前突然从满单元格变为空。我认为这是一个重要的提示,但我想不出所有数据突然消失的任何原因-我没有代码来移动或删除数据库文件。

首先,在查找bug时,没有不相关的函数调用,因此您可能应该使用整个调用堆栈进行编辑

看起来您正在请求一个对象(请参阅objectWithID调用),但当托管对象上下文获取它时,它找不到它

当您有一个单独的线程正在删除对象,并且您没有正确管理更改时,通常会发生这种情况

那么,是否有其他线程正在更改核心数据存储的状态?如果是这样,那可能就是你的罪魁祸首

核心数据并没有那么难。。。但它确实有几个规则,如果你不遵守,你会有麻烦

首先,确保不要从多个线程访问MOC

其次,如果多个线程正在更改底层存储,请确保
22  XXX  0x0009c193 -[TweetsViewController updateUI] (TweetsViewController.m:211)
16  XXX  0x0009ebab -[TweetsViewController tableView:heightForRowAtIndexPath:] (TweetsViewController.m:581)
14  CoreData  0x35fdd81d -[NSFetchedResultsController objectAtIndexPath:] + 204
10  CoreData  0x35f67065 -[NSManagedObjectContext objectWithID:] + 88
6   XXX  0x0003fd1b -[Status initWithEntity:insertIntoManagedObjectContext:] (Status.m:333)
5   XXX  0x0008a5c3 -[Tweet initWithEntity:insertIntoManagedObjectContext:] (Tweet.m:125)
- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context {
    self = [super initWithEntity:entity insertIntoManagedObjectContext:context];
    if (self) {
        // xxx_ is a persistent attribute while _xxx is the corresponding non-persistent attribute as its cache in memory only to reduce reading cost.
        _xxx = self.xxx_.unsignedIntegerValue;
    }
    return self;
}