Utilizzo i dati principali e ho trovato che l'app talvolta si arrestava in modo anomalo dopo la ripresa dallo sfondo. Ho identificato l'arresto anomalo che si verifica all'interno di un corpo del metodo di blocco quando provo ad accedere a una proprietà in una sottoclasse NSManagedObject
.Accesso a un dato principale NSManagedObject dopo la ripresa dallo sfondo arresta l'applicazione
Ho una proprietà che contiene un riferimento a una sottoclasse NSManagedObject
.
@property (nonatomic, strong) CalItem * calObject;
Per riprodurre l'incidente ho bisogno di chiamare il bambino viewController (NoteViewController
) passando un blocco (NoteTextBlock
).
NoteViewController *noteViewController = [[NoteViewController alloc]initWithNote:self.calObject.note NoteTextBlock:^(NSString *noteText) {
self.calObject.note = noteText; //crashing here
}];
Quindi inviare l'app in background e riprenderla. Successivamente in NoteViewController restituirò un messaggio al viewController chiamante.
if (self.noteTextBlock)
{
self.noteTextBlock(trimmedString);
}
Quando il blocco ritorna e la linea self.calObject.note = noteText
Viene eseguito l'applicazione si blocca.
Quindi a quanto pare non è possibile mettere un blocco in pila, abbastanza e riprendere l'app e quindi continuare con ciò che è stato definito all'interno del blocco? O sto facendo qualcosa di sbagliato qui?
Edit:
*** 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>''
Il blocco viene definito in questo modo all'interno del bambino viewController:
@property(nonatomic, copy)NoteTextBlock noteTextBlock;
Edit2
Questo è ciò che ottengo quando ho creato un punto di interruzione la linea in cui si blocca.
(lldb) po self.calObject
$2 = 0x0b4464d0 <DTODay: 0xb4464d0> (entity: DTODay; id: 0xb489d00 <x-coredata://C2304B7C-7D51-4453-9993-D33B9113A7A5/DTODay/p57> ; data: <fault>)
Sto utilizzando la lib MagicalRecord per gestire tutte le cose Core Data.
- (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];
}
Potrebbe fornire al messaggio di incidente? –
Che cos'è il managedObjectContext di calObject prima del crash? È niente? –
Il problema si verifica solo quando l'app si chiude e riprende mentre si utilizza un blocco come callback. In altre situazioni posso tranquillamente riprendere e continuare a usare calObject senza problemi. Potrebbe essere possibile che in qualche modo il blocco o 'sé' all'interno del blocco non venga mantenuto correttamente? – Oysio