Counting(ARC)を使用してメモリが管理されています。大体の場合、何も考えなくてもARCが正しくメモリを解放してくれますが、場合によっては参照カウントを意識して、問題が起こらないように注意深くコーディングしないといけない場面もあります。ここではARCの原理から、特有の問題点である循環参照によるメモリリークが発生する原因、その回避方法などを説明します。参考ARCの原理ARCの原理はシンプルです。以下のような簡単なクラスを考えます。}}Personインスタンスを生成し、ref1、ref2、ref3に代入した後、順番にnilに設定していくと、最後の参照がnilに設定されたタイミングでdeinitが呼び出され、メモリが解放されることがわかります。deinitSwiftでは通常変数への代入によって参照カウントが増えていきます。参照数が増える参照を「強参照」と呼びます。Optional型は強参照(そして弱参照にも)関係ありませんのでご注意ください。循環参照インスタンスが互いに強参照している場合にARCでメモリが解放できない状況が発生します。以下の2つのクラスを考えます。}}それぞれ互いのインスタンスを強参照しているため、参照カウントが0にならずどちらのインスタンスも解放されない状態が発生します。//Apartmentカウント1//=>カウントが0にならないためどちらのdeinitも呼ばれない循環参照をweak参照で解決する循環参照を解消する方法はもちろん準備されています。その方法の一つ目はweak参照を使用することです。tenant」と頭にweakをつけてインスタンスを参照していることに注目してください。weak参照は参照カウントが増えない参照なのです。tenant?.name}}WeakApartmentからはweak参照が使われているのでうまく解放することができます。weak参照はOptionalなので使用する際にunwrapする必要があります。住人からの参照がなくなっているので部屋も解放可能//=>どちらのdeinitも呼ばれる循環参照をunowned参照で解決するweakと似たunownedを使うこともできます。tenant.name}}unownedは非Optionalである代わりにインスタンス解放時にnilになりません。絶対にnilにならない場合に使用する必要があります。循環参照のバリエーションとしてClosureを使用する際、無意識のうちに循環参照状態になってしまうというものがあります。インスタンスのプロパティとしてClosureを強参照し、Closureの処理内からselfでインスタンスを強参照すると循環参照が発生します。nil//=>解放されないこの場合も通常の循環参照を解消する場合と同様に、weak/unowned参照を使って問題を解決することができます。deinitClosureがプロパティではない場合は問題ありません。deinitUIAlertControllerの表示処理って?Closureを積極的に使うことはあまり無いとしても、UIKitを使っていると至る所で気にしないといけない部分がでてきます。UIAlertControllerを使ってアラートを表示し、ボタンが押された場合の処理を行う箇所もClosureです。}}上記の例の場合、alertはローカル変数として保持されているため循環参照は発生しません。selfでキャプチャしなおす必要はないのです。ARCのまとめ循環参照が発生するとメモリリークが発生する可能性があるので要注意です。ここで問題になるのはあくまで循環参照が発生する場合なので、例えばViewController間で引数オブジェクトを引き回す場合は問題ありません(循環参照しているわけではないので)。Closure内でselfを使う場合循環参照が発生しがちなので注意が必要です。同じようなパターンとしてdelegateを使って処理を以上するパターンもあります。Countingそのアプリ、メモリリークしてませんか?Objctive-Cにおけるプロパティ属性まとめ。定数を定義するSwift言語で定数を定義する方法を説明します。さまざまな値を直接ソースコードに記述せず、定数として定義してその情報にアクセスするの...記事を読むプロパティSwift言語のプロパティはクラス、構造体、列挙型に結びつけられます。プロパティは単純に変数や定数を保持する「保持型プロパテ...記事を読むクラスと構造体の基礎Swiftにはクラス(Class)と構造体(struct)が存在します。コメントをキャンセルメールアドレスが公開されることはありません。