Dealloc UIPopovercontroller raggiunto mentre il popover è ancora visibile


111

Ti assicuro che ho cercato una risposta in SO per la mia domanda ma nessuna di esse è stata utile. Qui ho un semplice codice che dovrebbe presentare un UIImagePickerControllerall'interno di a 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];
}

Ora, anche dalla prima volta che vengo [UIPopoveController dealloc]raggiunto mentre ... errore e il programma si blocca. Non sto effettuando alcun mantenimento, rilascio o rilascio automatico secondo ARC. C'è qualche considerazione speciale UIPopoverControllersquando si beneficia di ARC?

Risposte:


203

UIPopoverControllers dovrebbe sempre essere contenuto in una variabile di istanza. È una buona pratica creare una proprietà forte per esso.

AGGIORNARE:

A partire da iOS 8 dovresti usare UIPopoverPresentationController. Quindi non è necessario mantenere un riferimento al popover perché è gestito dal controller di presentazione.

Esempio di codice (funziona sia su iPhone che su 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];

1
Oh, capisco. Ma non è come un UIAlertView? Non ho mai un ivar per questo, lo alloco semplicemente dovunque ne abbia bisogno, lo mostro e poi [usato per] rilasciarlo. In cosa è diverso il popovercontroller?
Mikayil Abdullayev

17
@Mikayil Il alertView è mantenuto dalla sua superview (come tutte le viste), ma il popoverController non è una vista, quindi non ha una superview, quindi non sarà conservato da nessuno se non lo mantieni (o memorizzalo in una variabile forte che ha un ambito più lungo del metodo corrente, ad esempio un iVar).
fzwo

1
Ma sono ancora confuso circa il conteggio di conservazione di UIPopoverController. Perché metto un controllo prima di allocare e iniziarne uno. E solo se è zero ne assegno uno nuovo. Ma dopo averlo assegnato per la prima volta non lo ottengo mai zero. Voglio dire, chiamo un metodo una volta. Lì assegno e inizio il mio ivar. E la prossima volta che chiamo di nuovo quel metodo questa volta trovo il mio ivar già assegnato. Se ARC si occupa di questo, allora quando lo rilascia. O lo rilascia automaticamente?
Mikayil Abdullayev,

Gli ivar @ Mikayil vengono rilasciati da ARC quando l'oggetto viene deallocato o quando vengono impostati su zero
Felix

ma non lo hanno menzionato nella documentazione, nella sezione Come usare usano la variabile locale
Amit Battan,

11

Quando la funzione esce non ci sono altri riferimenti al controller popover, quindi viene deallocata troppo presto.

Prova invece ad aggiungerlo come membro della tua classe.

Tim


Non dovrei ancora essere in grado di vederlo prima che venga deallocato?
Mikayil Abdullayev

10

Aggiungendo ciò che ha risposto @ phix23, creare * proprietà poc in questo modo:

@property (nonatomic, retain) IBOutlet UIPopoverController *poc;

e poi cambia

UIPopoverController *poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

per

self.poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

11
Non è necessario inserirlo nel file .h. Ciò lo renderebbe pubblico e, a meno che non lo desideri, rendilo una proprietà nel tuo file .m.
Joshua Dance
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.