以降は、自動参照カウントの動作例です。この例は、定数のストアドプロパティ 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.