ios - UIPopovercontroller dealloc alcanzado mientras popover sigue siendo visible
memory-management automatic-ref-counting (3)
Agregando lo que @ phix23 respondió, crea una propiedad * poc como esta:
@property (nonatomic, retain) IBOutlet UIPopoverController *poc;
y luego cambiar
UIPopoverController *poc = [[UIPopoverController alloc]
initWithContentViewController:picker];
para
self.poc = [[UIPopoverController alloc]
initWithContentViewController:picker];
Le aseguro que busqué una respuesta en SO para mi pregunta, pero ninguna de ellas fue útil. Aquí obtuve un código simple que debería presentar un UIImagePickerController
dentro de un UIPopoverController
:
-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc]
initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:NO];
}
Ahora, incluso desde la primera vez que recibo [UIPopoveController dealloc]
alcanzado mientras ... error y el programa falla. No estoy reteniendo, reenviando o lanzando automáticamente como ARC. ¿Hay alguna consideración especial con UIPopoverControllers
cuando se benefician de ARC?
Cuando la función sale, no hay otra referencia al controlador Popover, por lo que se desasigna demasiado pronto.
Intente agregarlo como miembro de su clase en su lugar.
Tim
UIPopoverControllers siempre debe mantenerse en una variable de instancia. Es una buena práctica crear una propiedad fuerte para ella.
ACTUALIZAR:
A partir de iOS 8, deberías utilizar UIPopoverPresentationController
. Entonces no necesita mantener una referencia al popover porque es administrado por el controlador de presentación.
Ejemplo de código (funciona tanto en iPhone como en iPad):
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];