抓取时Coredata崩溃

时间:2017-02-15 12:07:17

标签: ios objective-c core-data magicalrecord

我在制作应用程序中遇到了一些奇怪的coredata错误,我能够抓住崩溃报告。

有时会发生以下消息崩溃

  对象0x17e400000的

***错误:释放未分配的指针

     对象0x17fd03730的

***错误:未分配重新分配的指针

这是堆栈跟踪

Crashed: SQLQueue 0x13ff15250 for datastore.sqlite
SIGABRT ABORT 0x0000000183986014

0 libsystem_kernel.dylib    __pthread_kill + 8
1   libsystem_pthread.dylib  pthread_kill + 112
2   libsystem_c.dylib   abort + 140
3   libsystem_malloc.dylib  _nano_vet_and_size_of_live + 330
4   libsystem_malloc.dylib  nano_free + 220
5   libsqlite3.dylib    sqlite3_finalize + 244
6   CoreData    -[NSSQLiteConnection _finalizeStatement] + 100
7   CoreData    -[NSSQLiteConnection releaseSQLStatement] + 52
8   CoreData    newFetchedRowsForFetchPlan_MT + 2420
9   CoreData    _executeFetchRequest + 72
10  CoreData    -[NSSQLFetchRequestContext executeRequestUsingConnection:] + 60
11  CoreData    __52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 260
12  libdispatch.dylib   _dispatch_client_callout + 16
13  libdispatch.dylib   _dispatch_barrier_sync_f_invoke + 84
14  CoreData    -[NSSQLDefaultConnectionManager handleStoreRequest:] + 208
15  CoreData    -[NSSQLCoreDispatchManager routeStoreRequest:] + 288
16  CoreData    -[NSSQLCore dispatchRequest:withRetries:] + 200
17  CoreData    -[NSSQLCore processFetchRequest:inContext:] + 108
18  CoreData    -[NSSQLCore executeRequest:withContext:error:] + 504
19  CoreData    __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 4512
20  CoreData    -[NSPersistentStoreCoordinator _routeHeavyweightBlock:] + 276
21  CoreData    -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 408
22  CoreData    -[NSManagedObjectContext executeFetchRequest:error:] + 572
23  CoreData    -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] + 456
24  CoreData    __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 584
25  CoreData    internalBlockToNSManagedObjectContextPerform + 92
26  libdispatch.dylib   _dispatch_client_callout + 16
27  libdispatch.dylib   _dispatch_barrier_sync_f_invoke + 84
28  CoreData    _perform + 232
29  CoreData    -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] + 188
30 CoreData -[NSManagedObjectContext executeFetchRequest:error:] + 572
31  *MY_APP*    NSManagedObject+MagicalRecord.m line 50__67+[NSManagedObject(MagicalRecord) MR_executeFetchRequest:inContext:]_block_invoke

它确实发生在主线程上,我很困惑如何调试它。看起来像是一个记忆问题。此外,在使用工具时,当它遇到NSPrivateQueueConcurrencyType时,它会在应用中显示一些泄漏。

寻找关于钉牢它的一些见解。

应用程序正在广泛使用MagicalRecord,这是应用程序中的代码块导致上述崩溃。它只是主线程的正常提取。最有趣的是它随机崩溃,即它并不总是崩溃,但有时在进行抓取时会崩溃。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"code == %@ and pid == %@", aCode,pid];
Permission *aPermission = [Permission MR_findFirstWithPredicate:filterPredicate];

2 个答案:

答案 0 :(得分:4)

托管对象上下文队列之外的任何线程上访问(写入或读取)托管对象会导致未定义的行为&导致随机的奇怪的崩溃 您的Managed Object Context似乎是使用NSPrivateQueueConcurrencyType创建的。您在fetch上的效果Main Queue。这是怪异崩溃的根源 您可以使用MOC初始化NSMainQueueConcurrencyType,也可以将fetchRequests嵌套在[MOC performBlock:{...}]

答案 1 :(得分:1)

核心日期managedObjectContext和managedObjects不是线程安全的 - 既不用于写入,也不用于读取。如果您违反此规则,核心日期可能会随时崩溃 - 不一定是违规发生的地点/时间。因此,即使您在主线程上并访问为主线程设计的上下文,如果您在应用中的其他位置执行了错误操作,它仍然可能会崩溃。