52

handlerのクロージャを記述するときUIAlertAction、参照はself強い (デフォルト)かweak、またはunowned?

このトピックに関連する投稿 ( 1234 ) がありましたが、正直なところ、この場合にどのように役立つかわかりません。

この典型的なコードに注目しましょう:

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、アラートを表示するビュー コントローラーでもあります。

ドキュメントには次のように記載されています。

弱い参照を使用して、その参照がその寿命のある時点で「値を持たない」可能性がある場合はいつでも参照サイクルを回避します。参照が常に値を持つ場合は、代わりに所有されていない参照を使用してください。

私は目が見えないかもしれませんが、これが についての私の質問に答えるのにどのように役立つかまだわかりませんUIAlertAction.

上記のコードでは、その寿命のある時点でselfnil になることは可能ですか? はい。だから私はとしてマークする必要があります。selfweak

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

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

4

1 に答える 1

83

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

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

于 2016-01-21T18:33:38.593 に答える