ios - UIPopoverController dealloc recibe el llamado-entorno ARC
memory-management automatic-ref-counting (2)
Mientras se muestra un controlador de popover por segunda vez (después de descartarlo y volver a mostrarlo), aparece el siguiente error:
Aplicación de finalización debido a la excepción no detectada ''NSGenericException'', razón: ''- [UIPopoverController dealloc] alcanzado mientras popover aún está visible.''
El seguimiento de pila es solo un montón de hexadecimal y el SIGABRT ocurre en UIApplicationMain todo el tiempo. Aquí está el código que activa el botón:
- (IBAction)createNewScore:(id)sender {
if (self.pc)
if (self.pc.popoverVisible)
return;
else
// Breakpoint is hit here—crashes after this line
[self.pc presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
NGDocumentInfoViewController *documentInfoVC = [[NGDocumentInfoViewController alloc] initWithBlankDocumentTargetInManagedObjectContext:self.context];
UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:documentInfoVC];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneCreatingNewScore:)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelCreatingNewScore:)];
navc.navigationBar.topItem.leftBarButtonItem = doneButton;
navc.navigationBar.topItem.rightBarButtonItem = cancelButton;
CGSize popoverSize = CGSizeMake(documentInfoVC.view.bounds.size.width, documentInfoVC.view.bounds.size.height);
documentInfoVC.contentSizeForViewInPopover = popoverSize;
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navc];
popover.delegate = self;
self.pc = popover;
[popover presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
Me gustaría simplemente conservar el popover que solucionaría el problema, pero este es un entorno ARC, así que no tengo retener. ¿Hay alguna manera de corregir el error (sin desactivar ARC para el archivo y tener que hacer manualmente la memoria para todo el archivo)?
Editar: El popover se almacena como un ivar:
@property (strong) UIPopoverController *pc;
¿Alguien tiene una solución para este problema (tal vez una anulación de ARC)? Archivaré un BR como sugiere CodaFi, pero una solución sería agradable, ya que es un obstáculo en un proyecto importante. Si esto no es posible, entonces supongo que voy a sacar el mío.
Si su popover está almacenado como referencia fuerte, no puede desasignarse. La única posibilidad cuando se puede desasignar es cuando el objeto que contiene la referencia fuerte ( self
en su ejemplo) también se desasigna.
Creo que la pregunta importante es qué estás haciendo con tus puntos de vista cuando el popover es visible.
Si ya ha marcado esto, entonces debe ser un error de framework.
Me encontré con el mismo problema y lo solucioné reteniendo el controlador popover en una variable de instancia fuerte como se sugiere Y descartándolo explícitamente antes de restablecer la propiedad con el nuevo controlador popover asignado en la segunda ejecución de la acción. En su ejemplo, debe agregar algo como esto:
- (IBAction)createNewScore:(id)sender {
if (self.pc) {
[self.pc dismissPopoverAnimated:YES];
}