lector ocasional y la primera pregunta que pregunta el tiempo, así que por favor ser suave :)Odd Core Error de datos causado por la liberación excesiva?
Estoy creando un Managed Object (Cuenta), que se pasa en un controlador de vista del niño en su conjunto está en una propiedad que es retenido
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 de la interfaz del controlador:
@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
Así, en el ejemplo de código 1 Me he lanzado el objeto de cuenta porque ya no estoy interesado en él en ese método. Como lo conserva el AddAccountViewController Tengo una entrada en AddAccountViewController 's dealloc que lo libera.
Sin embargo, cuando voy a eliminar el objeto de la ManagedObjectContext la aplicación se bloquea con el siguiente (en lugar claro) Error:
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.
Después de mucha depuración & tirar del pelo descubrí que si no lo hago liberar cuenta en AddAccountViewControllerdealloc método la aplicación funciona correctamente de forma continua y no parece tener fugas según los instrumentos.
¿Alguien puede arrojar alguna luz sobre qué está pasando? Entiendo por los documentos sobre las propiedades que los que se retienen deben ser liberados. ¿Qué me he perdido?
actualización para responder a la pregunta de Kevin
El código para eliminar el objeto de la ManagedObjectContext está en el RootViewController (que sostiene el controlador niño)
// 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();
}
}
}
¿Puede mostrar el código que lo elimina del NSManagedObjectContext? ¿Y sucede esto dentro de AddAccountViewController o en otro lugar? –
'childController.anAccount = account;' esta línea NO retiene 'account'. Lo copia a 'una Cuenta'. Esto no retiene +1 en absoluto, y solo tendrá que liberar 'anAccount' en el método dealloc 'AddAccountViewcontroller'. –
@Thomas: '@property (nonatomic, retain) Cuenta * anAcount;' ¿Por qué no retendrá? – Pyetras