同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

ロケーション:
someFunction(completion: { [weak self] in
    self?.variable = self!.otherVariable
})

これは常に安全ですか?selfはステートメントの冒頭でオプションにアクセスします。個人的には、このステートメントの2番目の部分は、の場合self実行されないと想定していnilます。これは本当ですか?場合はself確かにあるnil、第二の部分は決して起こらないだろうか?そして、selfこの1行のコードの間に「埋め尽くされる」可能性は決してありませんか?

マーティンR:

「Swiftプログラミング言語」からのオプションのチェーンは、次の例を示します。

 let john = Person()
 // ...
 let someAddress = Address()
 // ...
 john.residence?.address = someAddress

続いて(強調を追加):

この例では、john.residenceが現在nilであるため、john.residenceのアドレスプロパティを設定しようとしても失敗します。

割り当てはオプションの連鎖の一部です。つまり、=演算子の右側のコードは評価されません。

あなたのケースに適用:

self?.variable = self!.otherVariable

右側はされていない場合は、評価selfですnilしたがって、あなたの質問への答え

自己が本当にnilの場合、2番目の部分は決して発生しませんか?

「はい」です。2番目の質問に関して

そして、この1行のコードの実行中に、自己が「埋もれる」可能性は決してありませんか?

私の元々の仮定は、いったんであるselfと決定されると、ステートメントの評価全体を通して!= nil強い参照self!が保持されるため、これが起こらないようにすることでした。ただし(@Hamishが指摘したように)、これは保証されません。AppleエンジニアのJoe Groffは、Swiftフォーラムの「操作の順序の確認」で次のように書いています

これは保証されていません。リリースは、これよりも前に、最後に強参照が正式に使用された後の任意の時点で最適化される場合があります。左辺を評価するためにロードされた強参照weakProperty?.variableは後で使用されないので、それを維持するものは何もないので、すぐに解放できます。
変数のゲッターに副作用があり、それによってによって参照さweakPropertyれるオブジェクトの割り当てが解除され、弱い参照が無視されると、右側の強制アンラップが失敗します。ifを使用して弱参照をテストし、if let

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

分類Dev

同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

分類Dev

オプションがnilでないことを確認した後、オプションを強制的にアンラップしても安全ですか?

分類Dev

アプリケーションがバックグラウンドで実行されたときにスレッドが強制終了されましたか?

分類Dev

同じドメインでホストされている別のlaravelアプリケーションを介してphpアプリケーションのセッションにアクセスするにはどうすればよいですか?

分類Dev

Android Oreo以降でアプリケーションが強制終了された場合でも、バックグラウンドで特定のUUIDについてIBeaconをスキャンするにはどうすればよいですか?

分類Dev

オプションの強制アンラップにnilを割り当ててもコードはクラッシュしませんが、それはなぜですか?

分類Dev

内部スコープで宣言された変数にポインターでアクセスしても安全ですか?

分類Dev

マルチスレッドアプリケーションで静的変数を使用しても安全ですか?

分類Dev

アプリが強制停止されている場合でもサービスを再起動し、アプリを閉じた後もバックグラウンドでサービスを実行し続ける方法

分類Dev

コマンドラインから強制終了した後でも、ハイブアプリケーションが実行中と表示される

分類Dev

アプリが強制終了された場合でも、バックグラウンドで5分ごとにvoid / classを実行するアラーム

分類Dev

デスコープされた変数のメモリアドレスを使用しても安全ですか?

分類Dev

CFCユーザーコンテンツハンドラーをアプリケーションスコープに保存しても安全ですか?

分類Dev

sshセッションを強制終了した後もリモートプロセスが実行されるのはなぜですか?

分類Dev

アプリケーションを閉じるときにC#で開始されたコマンドラインプロセスを停止します

分類Dev

Redissonを使用する複数の独立したアプリケーションが同じクラスター化されたRedisを共有できますか?

分類Dev

ネストされたオプションを1行で迅速に安全にアンラップできますか?

分類Dev

Xamain.AuthのさまざまなメソッドにAndroidアプリケーションコンテキストを使用しても安全ですか?

分類Dev

同じコンテナで同じコードベースで異なるプロファイルを使用して実行されている2つのSpringBootアプリケーションをリモートデバッグするにはどうすればよいですか?

分類Dev

コードシップで生成されたバックグラウンドプロセスを強制終了します

分類Dev

URL「/セッション」は有効なリソースにマッピングされませんでした| Javaを使用してwinAppDriver / Windowsアプリケーションのドライバを使用してデスクトップアプリケーションのテストを実行するには?

分類Dev

パブリックリモートブランチに強制的にプッシュしても安全ですか?

分類Dev

新しい定数を作成せずに、ガード条件で事前定義された変数にオプションをアンラップする

分類Dev

TFSグループのアクセス許可:グループ内のすべてのユーザーが、グループによって作成されたブランチを強制的にプッシュできるようにします

分類Dev

sqlalchemyスコープのセッションでMySQLストアドプロシージャを実行して、単一のデータセット(フラスコWebアプリの場合)を返すにはどうすればよいですか?

分類Dev

インバウンドアダプタ、アウトバウンドアダプタ、エラーチャネルを含み、同じCachingConnectionfactoryで設定されたフローでjmsセッションはどのように処理されますか

分類Dev

プログラム/アプリケーションをバックアップして、新しいものを再インストールした後でも、バックアップされたものを使用できるようにするにはどうすればよいですか?

分類Dev

プログラム/アプリケーションをバックアップして、新しいものを再インストールした後でも、バックアップされたものを使用できるようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

  2. 2

    同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

  3. 3

    オプションがnilでないことを確認した後、オプションを強制的にアンラップしても安全ですか?

  4. 4

    アプリケーションがバックグラウンドで実行されたときにスレッドが強制終了されましたか?

  5. 5

    同じドメインでホストされている別のlaravelアプリケーションを介してphpアプリケーションのセッションにアクセスするにはどうすればよいですか?

  6. 6

    Android Oreo以降でアプリケーションが強制終了された場合でも、バックグラウンドで特定のUUIDについてIBeaconをスキャンするにはどうすればよいですか?

  7. 7

    オプションの強制アンラップにnilを割り当ててもコードはクラッシュしませんが、それはなぜですか?

  8. 8

    内部スコープで宣言された変数にポインターでアクセスしても安全ですか?

  9. 9

    マルチスレッドアプリケーションで静的変数を使用しても安全ですか?

  10. 10

    アプリが強制停止されている場合でもサービスを再起動し、アプリを閉じた後もバックグラウンドでサービスを実行し続ける方法

  11. 11

    コマンドラインから強制終了した後でも、ハイブアプリケーションが実行中と表示される

  12. 12

    アプリが強制終了された場合でも、バックグラウンドで5分ごとにvoid / classを実行するアラーム

  13. 13

    デスコープされた変数のメモリアドレスを使用しても安全ですか?

  14. 14

    CFCユーザーコンテンツハンドラーをアプリケーションスコープに保存しても安全ですか?

  15. 15

    sshセッションを強制終了した後もリモートプロセスが実行されるのはなぜですか?

  16. 16

    アプリケーションを閉じるときにC#で開始されたコマンドラインプロセスを停止します

  17. 17

    Redissonを使用する複数の独立したアプリケーションが同じクラスター化されたRedisを共有できますか?

  18. 18

    ネストされたオプションを1行で迅速に安全にアンラップできますか?

  19. 19

    Xamain.AuthのさまざまなメソッドにAndroidアプリケーションコンテキストを使用しても安全ですか?

  20. 20

    同じコンテナで同じコードベースで異なるプロファイルを使用して実行されている2つのSpringBootアプリケーションをリモートデバッグするにはどうすればよいですか?

  21. 21

    コードシップで生成されたバックグラウンドプロセスを強制終了します

  22. 22

    URL「/セッション」は有効なリソースにマッピングされませんでした| Javaを使用してwinAppDriver / Windowsアプリケーションのドライバを使用してデスクトップアプリケーションのテストを実行するには?

  23. 23

    パブリックリモートブランチに強制的にプッシュしても安全ですか?

  24. 24

    新しい定数を作成せずに、ガード条件で事前定義された変数にオプションをアンラップする

  25. 25

    TFSグループのアクセス許可:グループ内のすべてのユーザーが、グループによって作成されたブランチを強制的にプッシュできるようにします

  26. 26

    sqlalchemyスコープのセッションでMySQLストアドプロシージャを実行して、単一のデータセット(フラスコWebアプリの場合)を返すにはどうすればよいですか?

  27. 27

    インバウンドアダプタ、アウトバウンドアダプタ、エラーチャネルを含み、同じCachingConnectionfactoryで設定されたフローでjmsセッションはどのように処理されますか

  28. 28

    プログラム/アプリケーションをバックアップして、新しいものを再インストールした後でも、バックアップされたものを使用できるようにするにはどうすればよいですか?

  29. 29

    プログラム/アプリケーションをバックアップして、新しいものを再インストールした後でも、バックアップされたものを使用できるようにするにはどうすればよいですか?

ホットタグ

アーカイブ