stateとは、アプリのローカルメモリ
アプリを終了すると消える仕組み、アプリごとにローカルメモリを持つ
iOSアプリは1つの プロセス として動作する
OSは各プロセスに 独立した仮想アドレス空間 を割り当てる
アプリA (プロセスA) → 仮想メモリ 0x0000_0000〜0xFFFF_FFFF
アプリB (プロセスB) → 仮想メモリ 0x0000_0000〜0xFFFF_FFFF
iOSはメモリ管理に 制約が強い
バックグラウンドアプリは一定時間で メモリを解放される
メモリ不足になるとアプリが強制終了されることもある
iOSも Linux と同じく プロセスの中にスレッドがある 仕組みになっています。正確には、iOS は Darwin(macOS/iOSのカーネル)上で動く Unix 系 OS なので、プロセスとスレッドの概念は Linux とほぼ同じ
DispatchQueue.global(qos: .background).async {
// 重い処理
let result = doHeavyTask()
// UI更新はメインスレッドで
DispatchQueue.main.async {
self.aiReply = result
}
}
Task {
let result = await fetchDataFromServer()
// メインスレッドでUI更新
await MainActor.run {
self.aiReply = result
}
}
let queue = OperationQueue()
queue.addOperation {
let result = doHeavyTask()
OperationQueue.main.addOperation {
self.aiReply = result
}
}
### 実際にstateを実装してみる
CounterPage.swift
import SwiftUI
struct CounterPage: View {
@State private var count = 0
var body: some View {
VStack(spacing: 20) {
Text("カウンター")
.font(.title)
Text("現在の値: \(count)")
.font(.headline)
Button("+1") {
count += 1
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
Button("リセット") {
count = 0
}
.padding()
.background(Color.red)
.foregroundColor(.white)
.cornerRadius(8)
Spacer()
}
.padding()
}
}
ユーザー操作やイベントによって変わる値を保持することが多い
なるほど〜