この強参照を無意識に使いまわしていると、例えば2つのインスタンスがお互いに強参照していまい永遠にメモリが解放されない、ということが起きてしまいます。イメージしやすいように以下で例を示します。}}PersonクラスとApartmentクラスはそれぞれお互いをプロパティとして持ちます。optionalとして定義しているため、初期値はnilです。次にそれぞれのインスタンスを強参照する変数を宣言します。"4A")Personインスタンスの持つapartmentプロパティにApartmentインスタンスを、Apartmentインスタンスの持つtenantプロパティにPersonインスタンスを代入します。johnここで、現在の参照関係は以下のようになっています。それぞれのインスタンスがお互いに強参照していることがわかります。変数john,unit4Aの強参照を切っても参照カウントはゼロになりません。呼び出されないことが確認できますね。解放されないメモリが蓄積されていくことになります。変数からの強参照を切った後の参照関係は以下のようになります。このインスタンス間の強参照は残り続け、メモリが解放されることはありません。(weak)弱参照はARCの参照カウントに加算されません。よって、強参照と弱参照を1つずつ持つインスタンスは参照カウントが1であり、1つの強参照を切ればインスタンスは解放されます。これを踏まえて上記の例を改善します。}}変更点は1箇所のみ、Apartmentクラスのtenantプロパティを弱参照で宣言しています。先の例と同様の参照関係を作ります。johnここで、現在の参照関係は以下のようになっています。Personインスタンスは変数johnからの強参照とApartmentインスタンスからの弱参照を持つため、参照カウントは1となります。変数johnにnilを代入して強参照を切ってみましょう。呼び出されていることがわかります。(unowned)弱参照と同様に非所有参照はARCの参照カウントに加算されません。自身と同じかより後にメモリが解放されるときに使うという具合に行います。上記の例では、Apartmentの居住者tenantは必ずしもいるとは限らず、またコロコロ変わるものであるため弱参照を使用するのが適切ですね。以下では非所有参照が適切なケース、クレジットカードとその利用者を例にとり説明します。}}CustomerクラスとCreditCardクラスはそれぞれお互いをプロパティとして持ちます。Customerはクレジットカードを持っていないかもしれませんが、CreditCardは必ずその持ち主Customerがいることになります。ゆえにCustomerクラスはcardプロパティをCreditCard?型として持ち、CreditCardクラスはcustomerプロパティを非所有参照として宣言しています。次にCustomerインスタンスを強参照する変数を宣言し、そのCustomerインスタンスのプロパティcardにCreditCardインスタンスを代入します。john!)ここで、現在の参照関係は以下のようになっています。Customerインスタンスは、変数johnからの強参照とCreditCardインスタンスからの非所有参照を持つため参照カウントは1となり、CreditCardインスタンスは、Customerインスタンスからの強参照を1つ持つため参照カウントは1となります。それでは、変数johnにnilを代入してCustomerインスタンスへの強参照を切ってみましょう。deinitializedまずCustomerインスタンスの参照カウントがゼロとなりメモリが解放されます。次にCreditCardインスタンスはCustomerインスタンスからの強参照を失い、参照カウントがゼロとなってメモリが解放されます。(!)PersonとApartmentの例では、それぞれをoptional型のプロパティとして持つため、弱参照が適切でした。CustomerとCreditCardの例では、一方はoptional型のプロパティとして、もう一方はoptional型ではないプロパティとしてそれぞれを持つため、非所有参照が適切でした。両方ともoptional型ではないプロパティとしてそれぞれを持ちたいケースも存在するはずです。そのときに利用するのが非所有参照と暗黙的アンラップ型です。以下ではこのケースを満たす例として、CountryクラスとCityクラスを示します。}}CountryクラスとCityクラスはそれぞれお互いをプロパティとして持ちます。Countryは必ず首都である町(city)が必要であり、Cityは必ず国(country)に所属しています。ゆえにCountryクラスはcapitalCityプロパティをCity!型として持ち、Cityクラスはcountryプロパティを非所有参照として宣言します。CountryクラスのinitializerではcapitalCityプロパティを初期化する際に、selfを使用しています。これはSwiftのinitializerのルールに反しますが(こちらの記事を参照)、capitalCityプロパティを暗黙的アンラップ型として宣言しているため初期値にはnilが入っており、これを可能にしています。Ottawa"上記のプログラムではCountryインスタンスを初期化し、その結果を出力しています。capitalCityプロパティはCountryインスタンスのinitializerにて既に初期化されているため、アクセスする際にnilであることを考慮する必要はありません。まとめ少々長くなりましたが、これがSwiftの参照パターンです。本稿が、強参照,弱参照,非所有参照のどれを使うべきかの判断の一助になれば幸いです。