web-dev-qa-db-ja.com

自分自身をUIAlertActionのハンドラーで強いものとしてキャプチャする必要がありますか?

handlerUIAlertActionクロージャーを書き込む場合、selfへの参照は強い(デフォルト)、weak、またはunownedである必要があります?

このトピックに関連する投稿( 12 、、 4 )がありましたが、正直に言ってはいけません 'この場合、彼らがどのように役立つかを見てください。

この典型的なコードに焦点を当てましょう:

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

これはUIViewControllerサブクラス内の関数なので、selfはアラートを表示するビューコントローラーです。

documentation はこう言っています:

弱参照を使用して、その参照の存続期間のある時点でその参照が「値なし」になる可能性がある場合は常に参照サイクルを回避します。参照に常に値がある場合は、代わりに所有されていない参照を使用します。

私は盲目かもしれませんが、これがUIAlertActionに関する私の質問への回答にどのように役立つかはまだわかりません。

上記のコードでは、selfがその寿命のある時点でnilになる可能性はありますか?はい。したがって、selfweakとしてマークする必要があります。

しかし、繰り返しになりますが、クロージャが呼び出されたときにselfがnilになるもっともらしいシナリオは考えられません。したがって、クロージャーに関する限り、selfは常に値を持ちます。したがって、selfunownedとしてマークする必要があります。

では、UIAlertActionのハンドラーでselfをどのようにキャプチャする必要がありますか?

43
Eric

自問する重要な質問は、アラートオブジェクトが自分で「所有」されているかどうかです。この場合、そうではありません(関数本体でlet alert = ...を宣言したため)。したがって、これを弱い参照または所有されていない参照として作成する必要はありません。

アラートが自己のプロパティである場合、それは自己によって「所有」され、アラートが「所有」するクロージャ内で自己への弱い参照を作成する場合です。

68
Good Doug