Lors de l'écriture de la fermeture handler
d'un UIAlertAction
, la référence à self
doit-elle être forte (par défaut), weak
ou unowned
?
Il y a eu des messages pertinents à ce sujet ( 1 , 2 , , 4 ) mais honnêtement, je ne le fais pas ' t voir comment ils aident dans ce cas.
Concentrons-nous sur ce code typique:
func tappedQuitButton() {
let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet)
let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(quitAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in
self.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)
}
Il s'agit d'une fonction à l'intérieur d'une sous-classe UIViewController
, donc self
est le contrôleur de vue présentant l'alerte.
Le documentation dit:
Utilisez une référence faible pour éviter les cycles de référence chaque fois qu'il est possible que cette référence n'ait "aucune valeur" à un moment donné de sa vie. Si la référence aura toujours une valeur, utilisez plutôt une référence sans propriétaire.
Je suis peut-être aveugle, mais je ne vois toujours pas en quoi cela aide à répondre à ma question sur UIAlertAction
.
Dans le code ci-dessus, est-il possible que self
soit nul à un moment donné de sa vie ? Oui. Je devrais donc marquer self
comme weak
.
Mais là encore, je ne peux pas penser à un scénario plausible où self
sera nul lorsque la fermeture sera appelée. Donc, en ce qui concerne cette fermeture, self
aura toujours une valeur . Je devrais donc marquer self
comme unowned
.
Donc, encore une fois, comment self
doit-il être capturé dans un gestionnaire UIAlertAction?
La question clé à vous poser est de savoir si votre objet d'alerte est "possédé" par vous-même. Dans ce cas, ce n'est pas le cas (car vous avez déclaré let alert = ...
dans le corps de la fonction). Vous n'avez donc pas besoin de créer cela comme une référence faible ou sans propriétaire.
Si l'alerte était une propriété de soi, elle serait alors "détenue" par lui-même et c'est à ce moment que vous voudriez créer une référence faible à soi dans la fermeture "détenue" par l'alerte.