handler
のUIAlertAction
クロージャーを書き込む場合、self
への参照は強い(デフォルト)、weak
、またはunowned
である必要があります?
このトピックに関連する投稿( 1 、 2 、、 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になる可能性はありますか?はい。したがって、self
をweak
としてマークする必要があります。
しかし、繰り返しになりますが、クロージャが呼び出されたときにself
がnilになるもっともらしいシナリオは考えられません。したがって、クロージャーに関する限り、self
は常に値を持ちます。したがって、self
をunowned
としてマークする必要があります。
では、UIAlertActionのハンドラーでself
をどのようにキャプチャする必要がありますか?
自問する重要な質問は、アラートオブジェクトが自分で「所有」されているかどうかです。この場合、そうではありません(関数本体でlet alert = ...
を宣言したため)。したがって、これを弱い参照または所有されていない参照として作成する必要はありません。
アラートが自己のプロパティである場合、それは自己によって「所有」され、アラートが「所有」するクロージャ内で自己への弱い参照を作成する場合です。