Qiitaとかの解説記事を読んでいるだけではなかなか理解しにくいですが、これらの大元の原理となっているARCについて知っておけばするする頭に入ってくるかと思います。Counting(自動参照カウント)の略で、自動でSwiftのコンパイラがメモリ領域の管理を行ってくれる仕組みです。他の言語ではGC(ガベージコレクション)によってメモリ管理を行っていることが多いかと思いますが、Swiftの場合このARCというもので管理を行います。後述しますが循環参照問題は、このARCを使っていることにより生じてしまう問題です。そのためSwift以外の言語を使っている人はあまり聞いたことのない単語かと思います。ARCはメモリ上のインスタンスやクロージャなどの参照型(Swiftでは関数は第1級オブジェクトなので参照型のオブジェクト扱いです)を、参照カウントを用いて管理します。参照カウントswiftではインスタンスは参照カウントで管理されています。参照の数が増えるたびに参照カウントが1ずつ増加し、減るごとに1ずつ現象、0になるとインスタンスを破棄します。実例で見ていきましょう。参照カウント:0これらの参照カウントの増減を自動でやってくれる仕組みをARCといいます。ちなみに昔(Objective-C時代)は、これらのメモリ管理をプログラマが手動で行っていたようです。泣きそうになりますね。Swiftにおいてインスタンスは実体そのものを取り扱うのではなく、実体自体は他のところにあり、コード上で扱えるのはそのポインタのみです。やってコード上でインスタンスの生き死にを決めるのか?の答えが参照カウンタによる管理(0ならば死、1以上ならば生)です。ここまでわかると、循環参照やweak/unownedの理解もしやすくなります。循環参照とはクラス間で相互に相手のインスタンスを参照し合うようなメソッドもしくはプロパティが存在する場合、それら全てのクラスのインスタンスへの参照を破棄しても、参照カウントは0にならないのでインスタンスがメモリ上に残り続けてしまう(メモリリーク)問題です。swiftでは関数が第1級オブジェクトであることにより、クラス内に存在するクロージャがselfを強参照してしまうと、循環参照が起こえます。実例を見てみましょう。//Hogeインスタンスの参照カウント:1この結果出力されるのはHoge爆誕!Fuga爆誕!だけです。Hoge死亡...Fuga死亡...が出力されません。HogeインスタンスもFugaインスタンスも解放されません。ARCでは参照カウントが0にならないとオブジェクトの解放を行わないからです。hogeにもfugaにもnilを入れてしまっているので、もはやアクセスができなくなってしまい、誰も使えないのにメモリ上にインスタンスだけ残り続けてしまっている状態になります。この状態がメモリリークであり、このような問題を循環参照と言います。これを解決するために出てくるのがweakやunownedです。強参照(strong参照)は参照するたびに参照カウントを1増やします。上のコードであったような普通の参照は、全てこの強参照です。一方で弱参照(weak参照)と非所有参照(unowned参照)は、参照しても参照カウントを増やしません。weakもしくはunownedを変数宣言の前につけると、その変数の参照方式はweak参照・unowned参照になります。実例をみてみましょう。解放とするとちゃんとHoge爆誕!Fuga爆誕!Fuga死亡...nilHoge死亡...と出力されます。nilによってしっかりとFugaインスタンスが破棄されます。解放Hoge爆誕!Hoge死亡...爆誕から間も無く即死亡します。インスタンスの生死はあくまでARCによって参照カウントで管理しているので、インスタンス生成時にweakやunownedをつけて参照するとインスタンスが生成された途端破棄されるという不思議な挙動を示します。weakとunownedの違い循環参照問題解決のためにはweak参照とunowned参照の2種類があります。これらの大きな違いとしては、簡単にいうとweakがOptional、unownedがnon-Optionalです。weak参照では、変数が参照した先のインスタンスが解放された時、その変数にはARCによってnilが代入されます。nilを許容するOptional型である必要があります。unowned参照では、nilが代入されません。non-Optional型でいいわけです。結果として、weak参照を使う変数の型はOptional型、unowned参照を使う変数の型はnon-Optional型になります。解放このようにweakを使うと、参照先のインスタンスが解放されても代わりにnilが入って問題なくアクセスできます。Hoge爆誕!Fuga爆誕!Fuga死亡...nilHoge死亡...このようにprint(self.fuga)はnilが出力されます。nilによってFugaインスタンスが解放されますが、hoge!.fugaにはnilが代入されません。したがって、hoge!.fugaは何も実体を持たないものになり、print(self.fuga)でアクセスエラーがおきます。エラーが起きる可能性があるのならなんでunowned参照なんか使うのか?という話ですが、unownedの場合はnon-Optionalなのでアンラップをしないですみ楽だからの一言に尽きます。「アプリの動作全体を通じて参照先のインスタンスが解放される可能性が絶対にない」という確信を持てればの話です。SwiftのOptional型に慣れないうちは下手にunownedを使わず、アンラップが手間でも全てweakを使っておいたほうが安全でしょう。self]とはクロージャの引数部分の前に宣言しておくことで、クロージャがselfを弱参照するようになります。...}循環参照対策に使われます。その先selfにアクセスする時はアンラップしておきましょう。}の一文で簡単にアンラップできます。このようなバッククォートを使った書き方でのオプショナルバインディングは仕様上のバグらしいです。まとめSwift特有のARCというガベージコレクションに似た仕組みは、インスタンスへの参照の数でインスタンスの生死を管理するようになっています。参照の中にも強参照・weak参照・unowned参照とあり、下図のように特徴があります。なしオブジェクトの所有関係、nilの代入可能性を意識して使い分けていきましょう。コピーut3をフォローするut3iOSも少々できるWebエンジニアut3をフォローするut3Utarog関連記事AWSCloud9でPython3環境構築入門!【AWS】PyQさんのおかげもあってPythonの文法や、簡単なWebアプリの開発周りについてはなんとなくわかってきました。なんでそろそろポートフォリオ作りたいなと思い、まずPyQから離れてプログラムを書き始めようと思ったわけです。...Programming【Python】ファイルの読み込み方まとめた【read,readline,readlines】Pythonにはtxtファイルの読み込み方が3種類あります。違いがよくわからず頭がこんがらがってきたので、一旦みやすくまとめてみます。3つのメソッドの違...ProgrammingMassAssignment脆弱性に関するアンチパターン例と対策PHPを使ってWebサービスを開発していた時、いわゆるMassAssignment脆弱性に該当するセキュリティホールを発見してしまいました。初心者エンジニアはついつい飛ばしてしまいがちなセキュリティですが、その重要性を改めて認識しました...MySQL【MySQL】日本語(ひらがな、カタカナ)を一文字でも含むレコードを取得する大したことはない内容ですが、ググっても分かりにくかったのでまとめます。...Angular【Angular】html文書をエスケープしないでそのままtemplateに表示するAngularなどのフロントエンドフレームワークでは、多くの場合HTMLを出力しようとすると自動で文字列にエスケープするセキュリティシステムが組み込まれています。これをサニタイジングといい、クロスサイトスクリプティング(XSS)対策のために...Programming【Swift】オプショナル型とは?4種類のアンラップ方法と共に解説!Swiftにはオプショナル型というものが存在し、このおかげで言語としてnull安全が保たれています。コメントをキャンセルメールアドレスが公開されることはありません。*サイト上に表示された文字を入力してください。【Swift】frameとboundsの違いは?UIViewにどう影響するのか【Swift】オプショナル型とは?4種類のアンラップ方法と共に解説!【Angular】html文書をエスケープしないでそのままtemplateに表示するアーカイブ2019年9月2019年5月2019年4月2019年3月2019年2月カテゴリーAngularAWSCSSDockerExcelJavaScriptMySQLPHPProgrammingPythonSwiftタイトルとURLをコピーしました。