UIAlertActionのハンドラーで自己を強力にキャプチャする必要がありますか?

エリック

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

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

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

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

グッドダグ

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

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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

スレッドクラスを使用して自己をキャプチャする必要がありますか?

分類Dev

C ++ラムダ。ポインタをどのようにキャプチャする必要がありますか?

分類Dev

このクロージャーで `tableView`をキャプチャする必要がありますか?

分類Dev

void *タイプにキャストする前にobjective-cハンドラーをコピーする必要があるのはなぜですか?

分類Dev

ストアドプロシージャのアーキテクチャ-MVCアプリケーションでストアドプロシージャを処理する必要がありますか、それとも「ワーカーロール」に似たもので処理する必要がありますか?

分類Dev

クリック時に特定のノードを強調表示する方法はありますか| ハイチャートサンキー

分類Dev

キャプチャカードを使用する場合、HDMI出力を使用する必要がありますか?

分類Dev

変更をキャプチャするには、Pythonでモジュールをリロードする必要がありますか?

分類Dev

クロージャ内で常に完了ハンドラーを呼び出す必要がありますか?

分類Dev

ARMとx86、私の状況ではハードウェアアーキテクチャの互換性に対処する必要がありますか?

分類Dev

UIAlertActionのクロージャ引数をどのように処理する必要がありますか

分類Dev

ラムダでconst参照によってキャプチャする必要がありますか?

分類Dev

エラーITMS-90092:「このバンドルは無効です。arm64アーキテクチャを含むアプリには、armv7アーキテクチャを含める必要があります。」

分類Dev

正規表現パターンが最後のペアのみをキャプチャするのはなぜですか?各試合ですべてのペアをキャプチャする必要があります

分類Dev

DTOをクリーンなアーキテクチャのどこに配置する必要がありますか?

分類Dev

constexpr式はC ++のラムダによってキャプチャされる必要がありますか?

分類Dev

Netty:「キープアライブ」接続の場合、チャネルを閉じる必要がありますか?

分類Dev

グローバルJSF例外ハンドラーがすべてのエラーをキャッチするわけではありません

分類Dev

キャッチされないエラー:noUiSlider(10.0.0):すべてのハンドルのフォーマッターを渡す必要があります

分類Dev

YouTube Data APIv3を使用してチャンネルの動画をGoogleスプレッドシートに入力する必要があります

分類Dev

Androidのどのクラスにsleep()があり、例外をキャッチする必要はありませんか?

分類Dev

オプションのGETパラメーターdjangoをキャプチャする方法(queryparamページに問題がありますか?)

分類Dev

このPromiseMongoErrorをどこでキャッチする必要がありますか?

分類Dev

このPromiseMongoErrorをどこでキャッチする必要がありますか?

分類Dev

ライブチャートWPFは、常にX軸にハードコードされたステップを表示する必要があります

分類Dev

戻り値を値またはr値参照でキャプチャする必要がありますか?

分類Dev

コントローラはアプリケーション層またはインフラストラクチャ層の内部にありますか?Clean Architectureでコントローラーを使用する必要がありますか?

分類Dev

コードを作成するには、マシンのアーキテクチャを知っている必要がありますか?

分類Dev

iOS 13 Apple Payボタンのクリックでエラーが発生します:「ユーザージェスチャーハンドラーから新しいApplePaySessionを作成する必要があります。」

Related 関連記事

  1. 1

    スレッドクラスを使用して自己をキャプチャする必要がありますか?

  2. 2

    C ++ラムダ。ポインタをどのようにキャプチャする必要がありますか?

  3. 3

    このクロージャーで `tableView`をキャプチャする必要がありますか?

  4. 4

    void *タイプにキャストする前にobjective-cハンドラーをコピーする必要があるのはなぜですか?

  5. 5

    ストアドプロシージャのアーキテクチャ-MVCアプリケーションでストアドプロシージャを処理する必要がありますか、それとも「ワーカーロール」に似たもので処理する必要がありますか?

  6. 6

    クリック時に特定のノードを強調表示する方法はありますか| ハイチャートサンキー

  7. 7

    キャプチャカードを使用する場合、HDMI出力を使用する必要がありますか?

  8. 8

    変更をキャプチャするには、Pythonでモジュールをリロードする必要がありますか?

  9. 9

    クロージャ内で常に完了ハンドラーを呼び出す必要がありますか?

  10. 10

    ARMとx86、私の状況ではハードウェアアーキテクチャの互換性に対処する必要がありますか?

  11. 11

    UIAlertActionのクロージャ引数をどのように処理する必要がありますか

  12. 12

    ラムダでconst参照によってキャプチャする必要がありますか?

  13. 13

    エラーITMS-90092:「このバンドルは無効です。arm64アーキテクチャを含むアプリには、armv7アーキテクチャを含める必要があります。」

  14. 14

    正規表現パターンが最後のペアのみをキャプチャするのはなぜですか?各試合ですべてのペアをキャプチャする必要があります

  15. 15

    DTOをクリーンなアーキテクチャのどこに配置する必要がありますか?

  16. 16

    constexpr式はC ++のラムダによってキャプチャされる必要がありますか?

  17. 17

    Netty:「キープアライブ」接続の場合、チャネルを閉じる必要がありますか?

  18. 18

    グローバルJSF例外ハンドラーがすべてのエラーをキャッチするわけではありません

  19. 19

    キャッチされないエラー:noUiSlider(10.0.0):すべてのハンドルのフォーマッターを渡す必要があります

  20. 20

    YouTube Data APIv3を使用してチャンネルの動画をGoogleスプレッドシートに入力する必要があります

  21. 21

    Androidのどのクラスにsleep()があり、例外をキャッチする必要はありませんか?

  22. 22

    オプションのGETパラメーターdjangoをキャプチャする方法(queryparamページに問題がありますか?)

  23. 23

    このPromiseMongoErrorをどこでキャッチする必要がありますか?

  24. 24

    このPromiseMongoErrorをどこでキャッチする必要がありますか?

  25. 25

    ライブチャートWPFは、常にX軸にハードコードされたステップを表示する必要があります

  26. 26

    戻り値を値またはr値参照でキャプチャする必要がありますか?

  27. 27

    コントローラはアプリケーション層またはインフラストラクチャ層の内部にありますか?Clean Architectureでコントローラーを使用する必要がありますか?

  28. 28

    コードを作成するには、マシンのアーキテクチャを知っている必要がありますか?

  29. 29

    iOS 13 Apple Payボタンのクリックでエラーが発生します:「ユーザージェスチャーハンドラーから新しいApplePaySessionを作成する必要があります。」

ホットタグ

アーカイブ