以降は、自動参照カウントの動作例です。この例は、定数のストアドプロパティ name を定義する、シンプルな Person クラスで始まります。

class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

Person クラスには、インスタンスの name プロパティを設定し、初期化が進行中であることを示すメッセージを出力する、イニシャライザがあります。また Person クラスには、クラスのインスタンスが割り当て解除されるときにメッセージを出力する、デイニシャライザもあります。

次のコードスニペットでは Person? 型の 3 つの変数を定義し、以後のコードスニペットで利用する新しい Person インスタンスの参照を複数準備しています。これらの変数はオプショナル型(Person でなく、Person?)なため、自動的に nil 値で初期化され、この時点では Person インスタンスを参照していません。

var reference1: Person?
var reference2: Person?
var reference3: Person?

新しい Person インスタンスを生成し、3 つの変数の 1 つに代入することができます。

reference1 = Person(name: "John Appleseed")
// "John Appleseed is being initialized" と出力

"John Appleseed is being initialized" メッセージは、Personクラスのイニシャライザを呼び出した時点で出力されることに注目してください。初期化が行われていることを確かめています。

新しい Person インスタンスが変数 reference1 に代入されているため、reference1 から新しい Person インスタンスに対して強い参照ができています。少なくとも 1 件の強い参照があるため、ARC はこの Person がメモリで保持されたまま、割り当て解除されないようにします。

同じ Person インスタンスをさらに 2 つの変数に代入した場合、さらに 2 件の強い参照がそのインスタンスに対して確立されます。

reference2 = reference1
reference3 = reference1

この時点で、この Person インスタンス 1 つに対する強い参照が 3 件になっています。

変数のうち 2 つに nil を代入することで(オリジナルの参照を含めて)強い参照のうち 2 件を切った場合、強い参照が 1 件残っているため、Person インスタンスは割り当て解除されません。

reference1 = nil
reference2 = nil

Person インスタンスを使うことがなくなって 3 件目の最後の強い参照が切れるまで、ARC は Person インスタンスを割り当て解除しません。

reference3 = nil
// "John Appleseed is being deinitialized" と出力

Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.