lettore occasionale e prima domanda richiedente volta, quindi si prega di essere gentile :)Odd Core Errore nei dati causato da un eccessivo rilascio?
sto creando un Managed Object (account), che si passa in un controller di vista del bambino, dove la sua soggiornare in una proprietà che è mantenuto.
Account * account = [[Account alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
AddAccountViewController *childController = [[AddAccountViewController alloc] init];
childController.title = @"Account Details";
childController.anAccount = account;
childController.delegate = self;
[self.navigationController pushViewController:childController animated:YES];
[childController release];
[account release];
La vista interfaccia controller:
@interface AddAccountViewController : UIViewController {
}
@property (nonatomic, retain) IBOutlet UITextField * usernameTextField;
@property (nonatomic, retain) IBOutlet UITextField * passwordTextField;
@property (nonatomic, retain) Account * anAccount;
@property (nonatomic, assign) id <AddAccountDelegate> delegate;
- (IBAction)cancel:(id)sender;
- (IBAction)add:(id)sender;
- (IBAction)textFieldDone:(id)sender;
@end
Così nel codice di esempio 1 Ho rilasciato l'oggetto account, perché io non sono più interessati a questo sono in questo metodo. Come è mantenuto dal AddAccountViewController Ho una voce in AddAccountViewController 's dealloc che lo rilascia.
Tuttavia quando vado per eliminare l'oggetto dal ManagedObjectContext l'applicazione si blocca con il seguente (poco chiaro) di errore:
Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
_Unwind_Resume called from function _PFFaultHandlerLookupRow in image CoreData.
Dopo molte debug & tirare i capelli ho scoperto che se non lo faccio release account in AddAccountViewController 's dealloc metodo l'app funziona in modo corretto e non sembra perdere secondo gli strumenti.
Qualcuno può fare luce su cosa sta succedendo? Capisco dai documenti sulle proprietà che quelli ritenuti devono essere rilasciati. Cosa mi sono perso?
Update per rispondere alla domanda di Kevin
Il codice per eliminare l'oggetto dal ManagedObjectContext è nel RootViewController (che tiene il controller bambino)
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the managed object for the given index path
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
[context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
// Save the context.
NSError *error = nil;
if (![context save:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
Potete mostrare il codice che lo elimina dalla NSManagedObjectContext? E questo accade all'interno di AddAccountViewController o altrove? –
'childController.anAccount = account;' questa riga NON conserva 'account'. Lo copia su 'anAccount'. Questo non fa +1 sul suo mantenimento, e dovrai solo rilasciare 'anAccount' nel metodo dealloc di' AddAccountViewcontroller'. –
@Thomas: '@property (nonatomic, retain) Account * anAccount;' Perché non dovrebbe conservarlo? – Pyetras