Si vous avez appris à la dure que vous devez supprimer le délégué d'un objet si la durée de vie du délégué est plus courte que l'objet. Mais comment faites-vous cela si vous n'avez plus de référence à l'objet?Suppression du délégué sur dealloc de l'objet non référencé
Dans mon application iPhone, j'ai un contrôleur de vue vc
qui effectue une activité asynchrone et est affiché en mode modal. Un bouton d'annulation permet de rejeter la vue modale. Si une erreur se produit, un UIAlertView alert
est affiché. Si l'utilisateur appuie sur OK, les deux alert
et la vue modale disparaissent. Par conséquent vc
est défini en tant que délégué pour alert
et implémente alertView:didDismissWithButtonIndex:
. Quelque chose comme ceci:
// UIViewController vc
...
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Error"
message:@"Something went wrong"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
self.alertView = alert; // needed to unset alertView.delegate in dealloc
[alert show];
[alert release];
...
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[self dismissModalViewControllerAnimated:YES];
}
}
Normalement, les blocs d'affichage d'alerte toutes les entrées. Malheureusement, il ne le fait pas dans certains cas. Si l'utilisateur appuie sur le bouton d'annulation avant que la vue d'alerte apparaisse et qu'elle retouche après l'affichage de l'alerte, la vue est ignorée, mais pas l'alerte. vc
obtient désalloué et si l'utilisateur tape puis "OK" sur l'alerte, l'application se bloque car un message a été envoyé à l'objet publié.
J'ai résolu cela en affectant alert
à une propriété de vc
afin que je puisse définir alert.delegate
à zéro dans dealloc. Je trouve cette solution pas très élégante, car je n'ai pas vraiment besoin de la référence pour alerter.
Y a-t-il une meilleure approche?
Edit: Ajouté le texte en italique comme clarification
J'ai essayé réglage userInteractionEnabled = NO mais le Touchup sur le bouton d'annulation est encore traitée. Je vais probablement devoir vivre avec la référence à la manière d'alerte. –