のhandler
クロージャーを書くときUIAlertAction
、参照はself
強い(デフォルト)、、、weak
またはunowned
?
そこは、このトピックに関連する記事(されている1、2、3、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
あり、ビューコントローラーもアラートを表示します。
弱参照を使用して、その参照がその寿命のある時点で「値なし」になる可能性がある場合は常に、参照サイクルを回避します。参照に常に値がある場合は、代わりに所有されていない参照を使用してください。
私は盲目かもしれませんが、これがについての私の質問に答えるのにどのように役立つのかまだわかりませんUIAlertAction
。
上記のコードでは、その寿命のある時点でself
ゼロになることは可能ですか?はい。だから私はとしてマークする必要があります。self
weak
しかし、繰り返しにself
なりますが、クロージャが呼び出されたときにゼロになるというもっともらしいシナリオは考えられません。そのクロージャに関する限り、self
は常に値を持ちます。だから私はself
としてマークする必要がありunowned
ます。
では、繰り返しになりますがself
、UIAlertActionのハンドラーでどのようにキャプチャする必要がありますか?
自分自身に尋ねる重要な質問は、アラートオブジェクトが自分で「所有」されているかどうかです。この場合、そうではありません(let alert = ...
関数本体で宣言したため)。したがって、これを弱い参照または所有されていない参照として作成する必要はありません。
アラートが自己のプロパティである場合、それは自己によって「所有」されます。その場合、アラートによって「所有」されているクロージャに自己への弱い参照を作成する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加