Skip to content

Instantly share code, notes, and snippets.

@KaitoMuraoka
Created March 31, 2024 10:32
Show Gist options
  • Save KaitoMuraoka/e2e49743869e0719dfafe88d2396b976 to your computer and use it in GitHub Desktop.
Save KaitoMuraoka/e2e49743869e0719dfafe88d2396b976 to your computer and use it in GitHub Desktop.
Swiftのメモリー管理
/**
Swift はメモリー管理にARC(Automatic Reference Counting) という仕組みを利用しています。
ARCは、インスタンスが作成されるたびに、値を保存するためのメモリを確保します。
このメモリは、以下の情報を保持します。
- インスタンスの型に関する情報
- プロパティの値
インスタンスが不要になると、ARCは使用されているメモリを自動的に解放します。
インスタンスが不要になったかを判断するために 参照カウンタ という仕組みを利用します。 ARCは、クラスのインスタンスが参照しているプロパティ、定数、および変数の数を追跡し、インスタンスに対して1つでもアクティブな参照が存在する限りは、インスタンスを解放しません。1つも参照がなくなったときに初めてメモリを解放します。
*/
import Foundation
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var person1: Person? = Person(name: "Taro")
var person2 = person1
var person3 = person1
print("person1: \(person1?.name)")// person1: Optional("Taro")\n
print("person2: \(person2?.name)")//person2: Optional("Taro")\n
print("person3: \(person3?.name)")//person3: Optional("Taro")\n
person1 = nil // Q.これでSwiftはメモリを解放する?
// しない。なぜなら Person1は解放しても、person2, 3 はインスタンスを参照している
/**
インスタンスとは?
A. クラスを具現化した「実体」のこと。
*/
print("person1: \(person1?.name)")
print("person2: \(person2?.name)")
print("person3: \(person3?.name)")
// Q person2, 3 を解放するにはどうすれば良い?
// A. person2, 3 も解放してあげる必要がある(今回の場合は、nilを代入してあげる)
person2 = nil
person3 = nil
print("person1: \(person1?.name)")
print("person2: \(person2?.name)")
print("person3: \(person3?.name)")
//この段階で初めて全ての参照がなくなり、Swiftは自動的に使われていたメモリを解放することができました。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment