Created
March 31, 2024 10:32
-
-
Save KaitoMuraoka/e2e49743869e0719dfafe88d2396b976 to your computer and use it in GitHub Desktop.
Swiftのメモリー管理
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
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