我正在使用核心数据,发现从后台恢复后应用程序有时会崩溃。当我尝试访问子类上的属性时,我已经确定了在块方法体内发生的崩溃NSManagedObject
。
我有一个包含NSManagedObject
对子类的引用的属性。
@property(nonatomic,strong) CalItem *calObject;
为了重现崩溃,我首先需要调用子 viewController( NoteViewController
) 并传递一个块 ( NoteTextBlock
)。
NoteViewController *noteViewController = [[NoteViewController alloc]initWithNote:self.calObject.note NoteTextBlock:^(NSString *noteText) {
self.calObject.note = noteText; //crashing here
}];
然后将应用程序发送到后台并恢复它。之后在 NoteViewController 中,我将向调用 viewController 返回一条消息。
if (self.noteTextBlock)
{
self.noteTextBlock(trimmedString);
}
当块返回并self.calObject.note = noteText
执行该行时,应用程序崩溃。
所以显然你不能在堆栈上放一个块,完全恢复应用程序,然后继续块内定义的内容?或者我只是在这里做错了什么?
编辑:
*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0xb253100 <x-coredata://C2304B7C-7D51-4453-9993-D33B9113A7A5/DTODay/p57>''
该块在子视图控制器中定义如下:
@property(nonatomic, copy)NoteTextBlock noteTextBlock;
Edit2
这是我在崩溃的行上设置断点时得到的。
(lldb) po self.calObject
$2 = 0x0b4464d0 <DTODay: 0xb4464d0> (entity: DTODay; id: 0xb489d00 <x-coredata://C2304B7C-7D51-4453-9993-D33B9113A7A5/DTODay/p57> ; data: <fault>)
我正在使用 MagicalRecord 库来管理所有核心数据的东西。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if ([NSManagedObjectContext MR_defaultContext] == nil
|| [NSManagedObjectModel MR_defaultManagedObjectModel] == nil
|| [NSPersistentStoreCoordinator MR_defaultStoreCoordinator] == nil
|| [NSPersistentStore MR_defaultPersistentStore] == nil
)
{
//coming back from background, re-init coredata stack
[MagicalRecordHelpers setupCoreDataStackWithAutoMigratingSqliteStoreNamed:DBNAME];
}