前回、Apple サンプルコードを見ながら、生存期間が謎だったのですが。
👉 【Swift】この ModelActor ってなぜ生きてるの?
シンプルなクラスにするとこういうことですね。
class Cat {
private(set) static var shared: Cat!
private init() {}
static func createInstance() {
shared = Cat()
}
func show() {
print("ねこ")
}
}
Cat.createInstance()
Cat.shared.show() // ねこ
一度インスタンスを生成すると、
全スコープから参照可能な状態で、アプリが死ぬまで生きてるんですね。
👉 Singleton pattern - Wikipedia
どう書いてますか Singleton。
少し Xcode PlayGround で試してみます。
ざっくりこのようなイメージでいたけども。
class Monkey {
private(set) static var instance: Monkey?
private init() {}
static func createInstance() -> Monkey {
if (instance == nil) {
instance = Monkey()
}
return instance!
}
func show() {
print("さる")
}
}
var monkey: Monkey? = Monkey.createInstance()
monkey?.show() // "さる"
monkey = nil
monkey?.show() // not show
公式ドキュメントを見ると以下のような感じになってます。
👉 Managing a Shared Resource Using a Singleton | Apple Developer Documentation
class Dog {
static let shared = Dog()
func show() {
print("いぬ")
}
}
Dog.shared.show() // いぬ
class Kiji {
static let shared: Kiji = {
let instance = Kiji()
return instance
}()
func show() {
print("きじ")
}
}
Kiji.shared.show() // きじ
var shared: Kiji? = Kiji.shared
shared?.show() // きじ
shared = nil
shared?.show() // not show
本当に死んでるのか?
Swift では、結構嫌がられてますよね Singleton。
使いすぎて収集つかずに太っちゃうやつですかね。
👉 Automatic Reference Counting | Documentation
👉 Kotlin で書きたい「正しいシングルトン(Singleton)」