ios memory-management uipopovercontroller automatic-ref-counting

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];