ios - 获取时 Coredata 崩溃

标签 ios objective-c core-data magicalrecord

我在生产应用程序中遇到了一些奇怪的核心数据错误,但我能够获得崩溃报告。

它有时会崩溃并显示以下消息

*** error for object 0x17e400000: Freeing unallocated pointer

*** error for object 0x17fd03730: pointer being reallocated was not allocated

这是堆栈跟踪

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,这是应用程序中导致上述崩溃的代码块。它只是从主线程中正常获取。最有趣的是,它会随机崩溃,即它并不总是崩溃,但有时会在执行 Fetch 时崩溃。

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

最佳答案

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

关于ios - 获取时 Coredata 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248955/

相关文章:

ios - 将 ECSlidingViewController 与 TableView 一起使用

ios - Jenkins 编译 .xib 时失败

ios - 核心数据的UISearchBar性能问题

ios - 如何将光标移动到 UITextView 中当前行的开头?

ios - 如何在 CoreData 中使用 NSPredicate 进行排序和限制?

objective-c - 如何在右上角创建带有完成按钮的 UIKeyboard?

iphone - iPhone编程远程数据更新

cocoa - 在核心数据中是否有任何内置机制可以将特定实体的实例限制为最大数量?

ios - 为什么我不能为我的 App Store Connect 添加新的银行账户?

ios - 从 appdelegate 访问 Tabbar View Controller 的子 Controller