Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【Swift】ARCと循環参照の概要

■ARC(Automatic Reference Counting)とは

インスタンスを生成するたびに、参照カウントを用いてそのインスタンスのためのメモリ領域を自動的に確保、不要になったタイミングでメモリを自動的に解放する方式です。デフォルトは強参照となります。

 

■循環参照とは

2つのインスタンスがお互いに強参照を持ちあう状態を循環参照と言います。この場合、インスタンスが不要になっても参照カウントが0になることはないため、メモリリークする可能性があります。

 

■循環参照の例 

以下Appleのドキュメントを読んだ際に、翻訳ではわかりにくい部分があったため、一部コメントを追記したものを本記事に残します。

The Swift Programming Language (Swift 4.1): Automatic Reference Counting 

// Personクラスのapartmentには初期値が与えられていない
class
Person { let name: String init(name: String) { self.name = name } var apartment: Apartment? deinit { print("\(name) is being deinitialized") } }
// Apartmentクラスのtenantには初期値が与えられていない
class Apartment { let unit: String init(unit: String) { self.unit = unit } var tenant: Person? deinit { print("Apartment \(unit) is being deinitialized") } } // 変数johnとunit4Aのプロパティの宣言 var john: Person? var unit4A: Apartment? // PersonクラスとApartmentのインスタンス化 john = Person(name: "John Applessd") unit4A = Apartment(unit: "4A") // クラスjohnのapartmentにunit4Aを、unit4Aクラスのtenantにjohnを代入
     (互いのクラスが強参照しあう)
john!.apartment = unit4A unit4A!.tenant = john // nilにしても参照カウントが残っているためメモリが解放されない john = nil unit4A = nil

 

■参考文献/関連リンク

・石川 洋資 西山 勇世 (2018) [改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

The Swift Programming Language (Swift 4.1): Automatic Reference Counting

筋肉SwiftプログラマーになるためのARCトレーニング - Qiita