コア データを使用していますが、バックグラウンドから再開した後にアプリがクラッシュすることがあります。NSManagedObject
サブクラスのプロパティにアクセスしようとすると、ブロック メソッド本体内で発生するクラッシュを特定しました。
NSManagedObject
サブクラスへの参照を保持するプロパティがあります。
@property(nonatomic,strong) CalItem *calObject;
クラッシュを再現するには、最初にNoteViewController
ブロック ( ) を渡して子 viewController( ) を呼び出す必要があり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>''
ブロックは、子 viewController 内で次のように定義されます。
@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 lib を使用して、すべてのコア データを管理しています。
- (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];
}