ios Sollte das Selbst in einem UIAlertAction-Handler so stark erfasst werden?



swift alert (1)

UIAlertAction beim Schreiben des UIAlertAction einer UIAlertAction der Verweis auf self stark (der Standardwert), weak oder nicht unowned ?

Es gab Posts, die für dieses Thema relevant waren ( 1 , 2 , 3 , 4 ), aber ich verstehe ehrlich gesagt nicht, wie sie in diesem Fall helfen.

Konzentrieren wir uns auf diesen typischen Code:

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)
}

Dies ist eine Funktion in einer UIViewController Unterklasse, also ist self der View-Controller, der die Warnung UIViewController .

In der documentation heißt es:

Verwenden Sie eine schwache Referenz, um Referenzzyklen zu vermeiden, wenn es möglich ist, dass diese Referenz zu einem bestimmten Zeitpunkt ihres Lebens keinen Wert mehr hat. Wenn die Referenz immer einen Wert hat, verwenden Sie stattdessen eine nicht besessene Referenz.

Ich bin zwar blind, aber ich verstehe immer noch nicht, wie dies dazu beiträgt, meine Frage zu UIAlertAction zu UIAlertAction .

Ist es im obigen Code möglich, dass das self irgendwann in seinem Leben Null ist? Ja. Also sollte ich mich als weak markieren.

Andererseits kann ich mir kein plausibles Szenario vorstellen, in dem das self Null sein wird, wenn die Schließung aufgerufen wird. Insofern hat das self immer einen Wert . Also sollte ich mich als nicht unowned .

Wie sollte das self in einem UIAlertAction-Handler erfasst werden?


Answer #1

Die wichtigste Frage, die Sie sich stellen müssen, ist, ob sich Ihr Alarmobjekt im "Eigenbesitz" befindet. In diesem Fall ist dies nicht der Fall (weil Sie let alert = ... im Funktionsrumpf deklariert haben). Sie müssen diese also nicht als schwache oder nicht im Besitz befindliche Referenz erstellen.

Wenn die Warnung eine Eigenschaft von sich selbst wäre, wäre sie "im Besitz" von sich selbst, und in diesem Fall möchten Sie einen schwachen Verweis auf sich selbst in der von der Warnung "im Besitz" befindlichen Schließung erstellen.





uialertaction