web-dev-qa-db-fra.com

Le soi doit-il être capturé aussi fort dans le gestionnaire UIAlertAction?

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?

43
Eric

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.

68
Good Doug